:pencil2:코드

import sys
sys.stdin = open("input.txt")
input = sys.stdin.readline

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

# min(n, m) / 2 만큼의 사이클이 존재
# 각 사이클의 맨 왼쪽 위 좌표는 (0, 0), (1, 1) ...

dr = [1, 0, -1, 0]
dc = [0, 1, 0, -1]

for _ in range(r):
    visited = [[False] * m for _ in range(n)]
    for i in range(min(n, m) // 2):
        r, c = i, i
        k = 0   # 방향
        cur = arr[r][c]
        while True:
            if r == i and c == i + 1:
                arr[i][i] = cur
                break

            nr, nc = r + dr[k], c + dc[k]
            if 0 <= nr < n and 0 <= nc < m and not visited[nr][nc]:
                visited[nr][nc] = True
                nxt = arr[nr][nc]
                arr[nr][nc] = cur
                cur = nxt
                r = nr
                c = nc
            else:
                k = (k + 1) % 4

for row in arr:
    print(*row)

:cry: 틀린 코드

import sys
# sys.stdin = open("input.txt")
input = sys.stdin.readline
from copy import deepcopy

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

# min(n, m) / 2 만큼의 사이클이 존재
# 각 사이클의 맨 왼쪽 위 좌표는 (0, 0), (1, 1) ...

dr = [1, 0, -1, 0]
dc = [0, 1, 0, -1]

for _ in range(r):
    visited = [[False] * m for _ in range(n)]
    for i in range(min(n, m) // 2):
        r, c = i, i
        k = 0   # 방향
        while True:
            if r == i and c == i + 1:
                temp[i][i] = arr[r][c]
                break

            nr, nc = r + dr[k], c + dc[k]
            if 0 <= nr < n and 0 <= nc < m and not visited[nr][nc]:
                temp[nr][nc] = arr[r][c]
                visited[nr][nc] = True
                r = nr
                c = nc
            else:
                k = (k + 1) % 4
            
    arr = deepcopy(temp)

for row in arr:
    print(*row)

:star:풀이

사실 어제부터 고민했던 문제인데 드디어 오늘 풀었다!

샤워하면서도 생각했고 자기 전에도 생각했었다 ㅎㅎㅎㅎ

하지만 역시 구현문제는 연필과 종이가 필요하다! 머릿속으로만 생각하던 것들을 종이에 써봤더니 해결방법이 보였다.

그러나 시간초과의 벽이 날 가로막고 있었다.

빈 배열을 하나 만들고 값을 옮겨 담으면서 배열을 복사하는 방식으로 했는데 계속 시간초과로 해결이 안됐다.

결국 변수 두개 cur이랑 nxt를 만들어서 값을 전달하는 방식으로 했다.

사실 이게 정석적인 풀이이고 기본적인 풀이인데 처음에 왜 이렇게 안풀었는지 참…

내가 푼 풀이도 굉장히 느린 방식이다. 맞히신 분들 중에 파이썬으로 100ms정도에 답을 내신분들도 꽤나 있다! 나는 아직 갈길이 멀다!!!


저번주부터 네이버 부스트캠프에 참여하고 있는데 너무 힘들다 :cry:

과제도 어렵고 공부해야할 것들이 산더미이다. 하루에 괜찮은 알고리즘 문제 하나 풀기도 벅차다.. 후

이런건 회고록에 써야하는데 ㅎㅎ 어쨋든 5개월동안 그냥 죽었다 생각하고 열심히 해보자 화이팅!!!

댓글남기기