goblin
리니팅
goblin

공지사항

전체 방문자
오늘
어제
  • 분류 전체보기 (75)
    • 개발 (31)
      • Spring (12)
      • JPA (4)
      • JAVA (4)
      • Python (6)
      • Docker (1)
      • Error (3)
      • Spring Cloud로 개발하는 MSA (1)
    • 알고리즘 (32)
    • 자료구조 (3)
    • 컴퓨터 개론 (3)
    • 개인 프로젝트 (4)
      • 쇼핑몰 만들기 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

태그

  • 정렬
  • 알고리즘
  • inflearn
  • 스프링부트
  • 다이나믹프로그래밍
  • 구현
  • 다이나믹 프로그래밍
  • 파이썬
  • 코딩테스트연습
  • 백준
  • python
  • springboot
  • 자료구조
  • tdd
  • 스프링
  • 파워자바
  • sorting
  • Spring
  • dp
  • 프로그래머스
  • gradle
  • 문자열
  • BOJ
  • JPA
  • 클래스
  • 동적계획법
  • 객체
  • 조합
  • 코딩테스트
  • Intellij

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
goblin

리니팅

알고리즘

[BOJ/Python3(파이썬)] 백준 16935번: 배열 돌리기 3

2022. 5. 12. 15:16
728x90

https://www.acmicpc.net/problem/16935

 

16935번: 배열 돌리기 3

크기가 N×M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다. 1번 연산은 배열을 상하 반전시키는 연산이다. 1 6 2 9 8 4 → 4 2 9 3 1 8 7 2 6 9 8 2 → 9 2 3 6 1 5 1 8 3 4 2 9 →

www.acmicpc.net

 

 

n,m,r=map(int,input().split())
arr = [list(map(int, input().split())) for _ in range(n)]
operation = list(map(int, input().split()))

def calc_1():
    temp=[ [0] * m for _ in range(n)]
    for i in range(n):
        temp[i] = arr[n-1-i]
    return temp

def calc_2():
    temp=[ [0] * m for _ in range(n)]
    for i in range(n):
        for j in range(m):
            temp[i][j]=arr[i][m-1-j]
    return temp

def calc_3(arr,n,m):
    temp=[ [0]*n for _ in range(m) ]
    for i in range(m):
        for j in range(n):
            temp[i][j]=arr[n-1-j][i]
    return temp

def calc_4(arr,n,m):
    temp=[ [0]*n for _ in range(m) ]
    for i in range(m):
        for j in range(n):
            temp[i][j]=arr[j][m-1-i]
    return temp

def calc_5():
    temp=[[0]*m for _ in range(n)]
    for i in range(n//2):
        for j in range(m//2):
            temp[i][j+m//2]=arr[i][j]

    for i in range(n//2):
        for j in range(m//2,m):
            temp[i+n//2][j] = arr[i][j]

    for i in range(n//2,n):
        for j in range(m//2,m):
            temp[i][j-m//2]=arr[i][j]

    for i in range(n//2,n):
        for j in range(m//2):
            temp[i-n//2][j] = arr[i][j]
    return temp

def calc_6():
    temp=[[0]*m for _ in range(n)]
    for i in range(n//2):
        for j in range(m//2):
            temp[i+n//2][j]=arr[i][j]

    for i in range (n//2,n):
        for j in range(m//2):
            temp[i][j+m//2]=arr[i][j]

    for i in range(n//2,n):
        for j in range(m//2,m):
            temp[i-n//2][j]=arr[i][j]

    for i in range(n//2):
        for j in range(m//2,m):
            temp[i][j-m//2]=arr[i][j]

    return temp

for oper in operation:
    if oper == 1:
        arr = calc_1()
    elif oper == 2:
        arr = calc_2()
    elif oper == 3:
        arr = calc_3(arr,n,m)
        n, m = m, n
    elif oper == 4:
        arr = calc_4(arr,n,m)
        n, m = m, n
    elif oper == 5:
        arr = calc_5()
    else:
        arr = calc_6()

for i in arr:
    print(*i)

 

단순 구현으로 풀었습니다.

연산의 결과를 담을 리스트를 temp라고 설정했고

반복문을 작성할 때 범위의 기준을 temp가 아닌 arr로 잡으면 계산하기 편하다고 생각했습니다.

1번 연산과 2번 연산의 경우는 설명을 생략하겠습니다. 

3번과 4번 연산의 경우 n과 m이 같지 않을 때를 고려해줘야 합니다. 배열의 모양이 달라지기 때문입니다.

3,4번 연산은 끝난 후에 다른 연산에서 범위를 맞추기 위해 다시 n과 m을 조정해야 합니다.

5,6번 연산은 헷갈릴 수 있지만 범위를 arr 배열을 기준으로 잡으면 쉽게 짤 수 있습니다.

3번 그룹에서 4번 그룹으로 가는 경우, arr의 i와 j이 속한 부분을 기준으로 잡고 temp에 값을 대입할 때 간단한 연산만 해주면 됩니다.

728x90
반응형

'알고리즘' 카테고리의 다른 글

[BOJ/Python3(파이썬)] 백준 5598번 : 카이사르 암호  (0) 2022.05.14
[BOJ/Python3(파이썬)] 백준 14499번: 주사위 굴리기  (0) 2022.05.13
[BOJ/Python3(파이썬)] 백준 2745번: 진법 변환  (0) 2022.01.17
[정렬] 백준 10825번 : 국영수(BOJ, Python, 파이썬)  (0) 2022.01.12
[문자열] 백준 10808번: 알파벳 개수(BOJ, Python, 파이썬), ord함수  (0) 2022.01.11
    '알고리즘' 카테고리의 다른 글
    • [BOJ/Python3(파이썬)] 백준 5598번 : 카이사르 암호
    • [BOJ/Python3(파이썬)] 백준 14499번: 주사위 굴리기
    • [BOJ/Python3(파이썬)] 백준 2745번: 진법 변환
    • [정렬] 백준 10825번 : 국영수(BOJ, Python, 파이썬)
    goblin
    goblin

    티스토리툴바