반응형
문제조건
- 화면 이모티콘 개수는 클립보드 이모티콘 개수에 따라 달라진다.
핵심개념
- BFS에서 하나의 정점이 여러 개의 정보를 갖고 있으면 안 된다.
- 화면 이모티콘 개수는 클립보드 이모티콘 개수에 따라 정보가 달라진다.
- 클립모드 이모티콘 개수를 기준으로 나눠서 BFS를 사용한다.
코드
from collections import deque
n = int(input())
dist = [[-1]*1001 for _ in range(1001)]
q = deque()
q.append((1, 0))
dist[1][0] = 0
while q:
s, c = q.popleft()
# (1) 화면 이모티콘을 클립보드에 복붙
if dist[s][s] == -1:
q.append((s, s))
dist[s][s] = dist[s][c] + 1
# (2) 클립보드 이모티콘을 화면에 복붙
if s+c <= n and dist[s+c][c] == -1:
q.append((s+c, c))
dist[s+c][c] = dist[s][c] + 1
# (3) 화면 이모티콘 1개 삭제
if s-1 >= 0 and dist[s-1][c] == -1:
q.append((s-1, c))
dist[s-1][c] = dist[s][c] + 1
ans = 1000
for i in dist[n]:
if i == -1 :
continue
else:
ans = min(ans, i)
print(ans)
from collections import deque
def bfs(emo):
global n
queue = deque()
queue.append(emo)
time[emo[0]][emo[1]] = 0
while queue:
s, c = queue.popleft()
for cmd in [(s,s), (s+c,c), (s-1,c)]:
if 0<=cmd[0]<=n and time[cmd[0]][cmd[1]] == -1:
time[cmd[0]][cmd[1]] = time[s][c]+1
queue.append(cmd)
# 화면에 원하는 이모티콘 개수가 있으면 탐색을 종료한다.
if cmd[0] == n:
return time[cmd[0]][cmd[1]]
n = int(input())
time = [[-1]*(n+1) for _ in range(n+1)]
answer = bfs((1,0))
print(answer)
3가지 연산을 배열로 만들어서 한 번에 비교하는 코드
반응형
'프로그래밍 > 알고리즘 문제' 카테고리의 다른 글
[BOJ2206 벽 부수고 이동하기] BFS (Python) (2) | 2019.10.07 |
---|---|
[BOJ3055 탈출] BFS (python) (2) | 2019.10.07 |
[BOJ 7576 - 토마토] BFS 알고리즘 (Python) (4) | 2019.10.06 |
[BOJ 2667 - 단지번호붙이기] BFS (Python) (4) | 2019.10.03 |
[B0J - 14888 연산자 끼워넣기(2)] 브루트포스(순열) python (4) | 2019.09.29 |
댓글