import sys
def input():
return sys.stdin.readline().rstrip()
def check(arr):
if max(arr) - min(arr) <=K:
return False
return True
def push():
min_value = min(arr[-1])
for i in range(N):
if arr[-1][i] == min_value:
arr[-1][i] += 1
def roll(arr):
row,col = 1,1
new_N = N
time = 0
while True:
new_temp = [[-1 for _ in range(new_N-col)] for _ in range(row+1)]
for y in range(col,new_N):
new_temp[-1][y-col] = arr[-1][y]
for y in range(col):
for x in range(len(arr)):
new_temp[y][len(arr)-x-1] = arr[x][y]
new_N = new_N-col
if time%2:
row += 1
col += 1
time += 1
arr = [row[:] for row in new_temp]
row_N = len(new_temp)
if row_N*(col+1) >N:
break
return arr
def outOfbound(x,y,row,col):
if 0<=x<row and 0<=y<col:
return False
return True
def blow():
row = len(new_arr)
col = len(new_arr[0])
temp = [[0 for _ in range(col)] for _ in range(row)]
for x in range(row):
for y in range(col):
if new_arr[x][y] == -1:continue
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if outOfbound(nx,ny,row,col):continue
if new_arr[nx][ny] == -1:continue
if new_arr[x][y] - new_arr[nx][ny] >=5:
gap = (new_arr[x][y] - new_arr[nx][ny])//5
temp[x][y] -= gap
temp[nx][ny] += gap
for x in range(row):
for y in range(col):
new_arr[x][y] += temp[x][y]
def flatting(maze):
temp_arr = [[]]
row = len(maze)
col = len(maze[0])
for y in range(col):
for x in range(row-1,-1,-1):
if maze[x][y]==-1:continue
temp_arr[-1].append(maze[x][y])
return temp_arr
def spread():
spread_arr = flatting(new_arr)
temp = [[-1 for _ in range(N//4)] for _ in range(4)]
for x in range(4):
if x%2:
start_x = N//4*x
y = 0
while y<N//4:
temp[x][y] = spread_arr[-1][start_x+y]
y += 1
else:
y = N//4-1
if x == 2:
start_x = 0
else:
start_x = N//4*2
while y>=0:
temp[x][y] = spread_arr[-1][start_x]
start_x += 1
y -= 1
return temp
N,K = map(int,input().split())
arr = [list(map(int,input().split()))]
dx = [-1,0,1,0]
dy = [0,-1,0,1]
turn = 0
while check(arr[-1]):
push()
new_arr = roll(arr)
blow()
new_arr = spread()
blow()
arr = flatting(new_arr)
turn += 1
print(turn)
삼성 기출 문제들 중에서 푸는데 제일 오래걸렸던 문제였다.
패턴은 찾았는데, 그걸 코드로 옮기는데 힘들었다.
두가지 부분이 힘들었는데 돌돌 마는 부분이랑
그리고 마지막에 4부분을 나눠서 합치는 부분이다.
이 부분엗 대한 패턴을 찾고, 그걸 코드로 옮겨주면 되는 문제였다.
내가 찾은 패턴은
돌돌 마는 패턴에서는
처음에
row 1 col1
row2 col1
row2 col2
row3 col2
row3 col3
접혀진 부분의 크기가 이와 같음을 알 수 있다.
또한 이때 다음번의 영향은 그 전의 col만큼 이후것들은 제일 밑단에 감을 알 수 있고
원래 말려있던 부분들은 오른쪽으로 90도 회전을 함을 알 수 있다.
이런 방식으로 해서 구해주면 된다.
마지막으로 4부분으로 나눠서 합치는 부분은 예제 그림을 잘 보면 패턴을 찾을 수 있다.
위치가 어떻게 되어있던지
1 2 3 4 5 6 7 8 9 .... 4N
4N 이라는 길이의 array가 있으면
3N 3N-1 3N-2 .... 2N+1
N+1 N+2 .... 2N
N N-1 N-2 .... 1
3N+1 3N+2 .... 4N
처럼 접히는것을 알 수 있고, 이걸 구현해주면 된다.
이 외에는 이번 삼성기출에서 풀었던 것처럼 해주면 된다.
이 풀이 자체는 좀 난잡하게 푼 문제라서, python으로 푸시는 분들은
jh05013님의 풀이를 참조하시는걸 추천드립니다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 12912 트리 수정 (0) | 2021.12.23 |
---|---|
[BOJ/백준] 2240 자두나무 (0) | 2021.12.04 |
[BOJ/백준] 23288 주사위 굴리기 2 (0) | 2021.10.27 |
[BOJ/백준] 23290 마법사 상어와 복제 (0) | 2021.10.26 |
[BOJ/백준] 23289 온풍기 안녕! (0) | 2021.10.25 |