코딩 공부

[Python] (구현) 백준 16926번 : 배열 돌리기1 본문

그외 여러 알고리즘 유형

[Python] (구현) 백준 16926번 : 배열 돌리기1

Algomalgo 2024. 6. 30. 21:41
728x90


<접근 방법>
[1] 끝 테두리부터 하나의 배열로 따준다.
[2] 배열의 순서대로 두 값을 변경해준다.
[3] 만일 회전의 수가 너무 크다면 중복이 되므로 실행 속도를 줄이기 위해 고려해본다.


<풀이 1>

앞뒤의 배열 값을 바꿔주는 것을 회전의 수만큼 반복한다.

N, M, R = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
directions = {0:(-1, 0), 1:(0, 1), 2:(1, 0), 3:(0, -1)}
visited = [[0]*M for _ in range(N)]
si, sj = 0, 0
while True:
    # 종료조건
    if visited[si][sj]: break
    visited[si][sj] = 1
    d = 1
    # 추출
    temp_arr = [(si, sj)]
    ci, cj = si, sj
    while True:
        ni = si + directions[d][0]
        nj = sj + directions[d][1]
        if (ni, nj) == (ci, cj): break
        if 0<=ni<N and 0<=nj<M and not visited[ni][nj]:
            visited[ni][nj] = 1
            temp_arr.append((ni, nj))
            si, sj = ni, nj
        else: d = (d+1)%4
        
    r = R % len(temp_arr)  # 불필요한 회전 수 제거
    temp_arr.append(temp_arr[0])
    for _ in range(r):
        for k in range(len(temp_arr)-2):  # 앞뒤 수 바꿔줌으로써 한칸 이동
            arr[temp_arr[k][0]][temp_arr[k][1]], arr[temp_arr[k+1][0]][temp_arr[k+1][1]] = arr[temp_arr[k+1][0]][temp_arr[k+1][1]], arr[temp_arr[k][0]][temp_arr[k][1]]
    sj += 1

for i in arr:
    print(*i)


<풀이 2>

회전 수만큼 칸을 건너뛰어 바꿔주고 이미 바뀐 값을 또 뒤집지 않도록 따로 배열의 값을 저장해둔 것을 대입해준다.

N, M, R = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
directions = {0:(-1, 0), 1:(0, 1), 2:(1, 0), 3:(0, -1)}
visited = [[0]*M for _ in range(N)]
si, sj = 0, 0
while True:
    if visited[si][sj]: break
    visited[si][sj] = 1
    d = 1
    temp_arr = [(si, sj)]
    ci, cj = si, sj
    while True:
        ni = si + directions[d][0]
        nj = sj + directions[d][1]
        if (ni, nj) == (ci, cj): break
        if 0<=ni<N and 0<=nj<M and not visited[ni][nj]:
            visited[ni][nj] = 1
            temp_arr.append((ni, nj))
            si, sj = ni, nj
        else: d = (d+1)%4
        
    r = R % len(temp_arr)  # 불필요한 회전 수 제거
    ttt = []  # 값이 변하지 않게 임시 저장 값
    for k in range(r):
        ttt.append(arr[temp_arr[k][0]][temp_arr[k][1]])
    for k in range(len(temp_arr)-r):
        arr[temp_arr[k][0]][temp_arr[k][1]], arr[temp_arr[k+r][0]][temp_arr[k+r][1]] = arr[temp_arr[k+r][0]][temp_arr[k+r][1]], arr[temp_arr[k][0]][temp_arr[k][1]]
    p = 0
    for k in range(len(temp_arr)-r, len(temp_arr)):
        arr[temp_arr[k][0]][temp_arr[k][1]] = ttt[p]
        p += 1
    sj += 1
for i in arr:
    print(*i)

 

728x90