여니의 취준 준비/코딩테스트 (Python)

[n16926] 배열 돌리기 (python)

여니's 2021. 5. 26. 22:33

 

 

풀긴 풀었으나,

pypy3으로 돌려야 시간초과 안난다 ㅠㅠ

파이썬으로 돌리면 시간 초과...

좀 더 연구해보자

효과적인 방법을..!

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


def rotate():
    global array
    cut_line = min(n, m) // 2


    for _ in range(r):
        fr, br = 0, n - 1  # 기준점 좌표
        fc, bc = 0, m - 1
        while cut_line and fr < cut_line:
            key = array[fr][fc]

            fr_br = br - fr  # 행
            fc_bc = bc - fc  # 열

            # 1번, 좌
            array[fr][fc:bc] = array[fr][fc + 1:bc + 1]

            # 2번, 상

            cnt = 0
            for _ in range(fr_br):
                array[fr + cnt][bc] = array[fr + cnt + 1][bc]
                cnt += 1

            # 3번, 우
            array[br][fc + 1:bc + 1] = array[br][fc:bc]

            # 4번, 하
            cnt = 0
            for _ in range(fr_br):
                # print(fr+br-cnt,fr+br-cnt-1)
                # array[fr + br - cnt][fc] = array[fr + br - cnt - 1][fc]
                array[br - cnt][fc] = array[br - cnt - 1][fc]
                cnt += 1

            array[fr + 1][fc] = key

            fr += 1
            br -= 1
            fc += 1
            bc -= 1


rotate()
for i in range(n):
    for j in range(m):
        print(array[i][j], end=' ')
    print()

 

 

 

아래 코드는  pypy3으로 해도 초과난다 ㅎㅎ

deepcopy 때문인 듯 ㅠㅠ

이 문제에서는 deepcopy를 하지 않아도 문제가 잘 풀린다!

 

근데 주의해야할 것은

탐색 순서!!

 

맨 왼쪽 상단값은 탐색 전 key에 담아둔다!

그리고 모든 방향 탐색을 마치면,

마지막에 array[fr+1][fc]로 해주면 된다!!

 

from copy import deepcopy

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

# n,m 중 작은 값이 짝수여야 함. -> 즉 좌,하,우,상 회전을 다 한다는 뜻
# (0,0), (1,1) 기준값이 행//2 보다 커야함.

# 좌,하,우,상

def rotate():
    global array
    cut_line = n // 2

    for _ in range(r):
        fr, br = 0, n - 1  # 기준점 좌표
        fc, bc = 0, m - 1
        ex_array = deepcopy(array)
        while fr < cut_line:
            fr_br = br - fr  # 행
            fc_bc = bc - fc  # 열

            # 1번, 좌
            cnt = 0
            for _ in range(fc_bc):
                ex_array[fr][fc + cnt] = array[fr][fc + 1 + cnt]
                cnt += 1

            # 2번, 하
            cnt = 0
            for _ in range(fr_br):
                ex_array[fr + cnt + 1][fc] = array[fr + cnt][fc]
                cnt += 1

            # 3번, 우
            cnt = 0
            for _ in range(fc_bc):
                ex_array[br][fc + 1 + cnt] = array[br][fc + cnt]
                cnt += 1

            # 4번, 상
            cnt = 0
            for _ in range(fr_br):
                ex_array[fr + cnt][bc] = array[fr + cnt + 1][bc]
                cnt += 1

            fr += 1
            br -= 1
            fc += 1
            bc -= 1

            array = deepcopy(ex_array)

rotate()
for i in range(n):
    for j in range(m):
        print(array[i][j],end=' ')
    print()

> 시간 초과가 떠버렸다 ㅜㅠ

다시 고쳐야지...

 

 

'여니의 취준 준비 > 코딩테스트 (Python)' 카테고리의 다른 글

[n20207] 달력  (0) 2021.08.24
[n17276] 배열 돌리기 (in python)  (0) 2021.05.29
[n2615] 오목 (in python)  (0) 2021.05.26
[n17413] 단어 뒤집기 2 (in python)  (0) 2021.05.25
[n20436] ZOAC 3 in python  (0) 2021.05.21