Notice
Recent Posts
Recent Comments
Link
코딩 공부
[Python] (구현) 백준 16926번 : 배열 돌리기1 본문
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
'그외 여러 알고리즘 유형' 카테고리의 다른 글
[Python] (구현) 백준 14719번 : 빗물 (0) | 2024.06.27 |
---|---|
[Python] 백준 1351번 : 무한 수열 (0) | 2024.03.21 |
[Python](이분탐색) 백준 1920번 : 수 찾기 (0) | 2024.03.21 |