본문 바로가기

코딩테스트

[백준] 16926번 : 배열 돌리기 1 - 파이썬

아이디어 : 구현

문제 해결 과정

배열을 돌리는 문제 !

1. 가장 밖의 배열을 돌린다.

2. 안의 배열을 돌린다. (min(N,M)//2 반복)

3. 위 과정을 R 번 반복한다.

 

배열을 돌리는 방법은

좌, 하, 우, 상 으로 범위를 나눠서 인덱스를 조정해준다.

graph[y][x ] : 좌, 하, 우, 상 인 경우 나눠서 y, x 인덱스 조정

prev_value : 현제 차례에 배열에 넣어야 할 값 저장

next_value : 다음 차례에 배열에 넣어야 할 값 저장

나의 답안

import sys

input = sys.stdin.readline
N, M, R = map(int, input().split())

graph = []
for _ in range(N):
    graph.append(list(map(str, input().split())))

for _ in range(R):
    for r in range(min(N,M)//2):
        # 초기값 
        x = r
        y = r
        prev_value = graph[y][x]
        # 좌
        for d in range(r+1, N-r):
            y = d
            next_value = graph[y][x]
            graph[y][x] = prev_value
            prev_value = next_value
        # 하
        for d in range(r+1, M-r):
            x = d
            next_value = graph[y][d]
            graph[y][d] = prev_value
            prev_value = next_value
        # 우
        for d in range(r+1, N-r):
            y = N - 1 - d
            next_value = graph[y][x]
            graph[y][x] = prev_value
            prev_value = next_value
        # 상
        for d in range(r+1, M-r):
            x = M - 1 - d
            next_value = graph[y][x]
            graph[y][x] = prev_value
            prev_value = next_value

for n in range(N):
    for m in range(M):
        print(graph[n][m], end=' ')
    print()

 

추가 - 2차원 배열 출력

방법 1

for n in range(N):
    for m in range(M):
        print(graph[n][m], end=' ')
    print()

방법 2 (배열 요소 str 여야 함)

for line in graph:
    print(" ".join(line))

추가 - 파이썬 내장 함수 min, max

- min() : 최소값 반환

- max() : 최대값 반환

 

추가 - pypy3, python3

동일 로직을 Python3에서 실행하였을 경우 시간 초과 결과가 발생하며,

pypy3를 사용할 경우 성공하였다.

구글링 결과 pypy3는 실행 시, 자주 쓰이는 코드를 캐싱하는 기능이 있기 때문에,

복잡한 코드를(반복)할 경우 속도면에서 우세하다고 한다.