소스 코드(pypy로 돌림)
def bfs(ii,jj):
global idx
while len(temp_idx) != 0:
i, j = temp_idx.pop(0)
for e in range(4):
ni = i + x[e]
nj = j + y[e]
# index 범위 조건
if 0 <= ni < n and 0 <= nj < n:
# l 이상 r 이하 조건, 방문 조건
if l <= abs(board[i][j] - board[ni][nj]) <= r and check[ni][nj] == -1:
# 연합이 된 위치의 값 더하고
temp_num[0] += board[ni][nj]
# 지금까지 연합의 개수 갱신
temp_num[1] += 1
temp_idx.append([ni, nj])
# 방문 및 나중에 store에서 값을 구해올 인덱스 값 저장
check[ni][nj] = idx
# 연합한 적이 있으면
if temp_num[1] > 1:
# 시작 위치에도 인덱스 값 저장
check[ii][jj] = idx
# 연합한 적이 있으면
if temp_num[1] > 1:
# 연합의 평균 store[idx]에 저장
store[idx] = int(temp_num[0] / temp_num[1])
# 인덱스 갱신
idx += 1
return
# 좌 우 상 하
x = [0, 0, -1, 1]
y = [-1, 1, 0, 0]
n, l, r = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
# 이동 횟수
cnt = 0
while True:
# idx, store, check 초기화
idx = 0
store = [0] * (n * n // 2)
check = [[-1] * n for _ in range(n)]
for q in range(n):
for w in range(n):
# 방문한 적 없으면
if check[q][w] == -1:
temp_num = [board[q][w], 1]
temp_idx = [[q, w]]
bfs(q,w)
# idx != 0은 연합한 적 있음을 의미
if idx != 0:
for qq in range(n):
for ww in range(n):
# 인덱스값 저장되어 있으면
if check[qq][ww] != -1:
# board값 갱신
board[qq][ww] = store[check[qq][ww]]
# 한 번이라도 연합한 적 없으면 끝내기
else:
break
# 한바퀴 다 돌면 이동 횟수 + 1
cnt += 1
print(cnt)
해결 방법
board
a | b |
c | d |
store
0 | 0 |
check
-1 | -1 |
-1 | -1 |
temp_num
a | 1 |
idx = 0
1. board에서 시작 위치를 정한 후, 네 방향을 확인하면서 bfs 돌기
2. 연합이 되는 곳을 발견하면 check에서 같은 위치에 있는 값을 idx값으로 갱신해줌
2-1. 그 후, 해당 위치의 값(board)을 temp_num[0]에 더 해주고, temp_num[1]에 +1 해줌
3. bfs가 끝나고 temp_num을 이용해서 연합의 평균을 구하고, 이를 store[idx]에 저장
4. idx + 1해서 다음 연합은 다음 idx에 저장할 수 있도록 갱신
5. 반복
6. 다 끝난 후, idx값이 바뀌었으면(연합한 적이 한번이라도 있으면)
check를 돌면서 -1이 아니면 해당 위치의 값(idx)를 통해 store의 값을 찾고, 이를 통해 같은 위치의 board의 값을 갱신
느낀 점
1. python3으로는 아무리해도 해결이 안 되더라...(결국 pypy로 돌렸음)
2. 시간초과 문제를 해결하기 위해 append를 최소화할 수 있는 방법을 찾기 위해 노력
ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.
오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.
혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.
'코딩 문제해결 > 문제 풀이.백준' 카테고리의 다른 글
[BOJ/백준 코딩] 암호 만들기 - PYTHON #1759 (0) | 2021.10.07 |
---|---|
[BOJ/백준 코딩] 부분수열의 합 - PYTHON #1182 (0) | 2021.10.06 |
[BOJ/백준 코딩] 주사위 굴리기 - PYTHON #14499 (0) | 2021.02.27 |
[BOJ/백준 코딩] 톱니바퀴 - PYTHON #14891 (0) | 2021.02.25 |
[BOJ/백준 코딩] 연산자 끼워넣기 - PYTHON #14888 (0) | 2021.02.24 |