728x90
문제
영선이는 매우 기쁘기 때문에, 효빈이에게 스마일 이모티콘을 S개 보내려고 한다.
영선이는 이미 화면에 이모티콘 1개를 입력했다. 이제, 다음과 같은 3가지 연산만 사용해서 이모티콘을 S개 만들어 보려고 한다.
- 화면에 있는 이모티콘을 모두 복사해서 클립보드에 저장한다.
- 클립보드에 있는 모든 이모티콘을 화면에 붙여넣기 한다.
- 화면에 있는 이모티콘 중 하나를 삭제한다.
모든 연산은 1초가 걸린다. 또, 클립보드에 이모티콘을 복사하면 이전에 클립보드에 있던 내용은 덮어쓰기가 된다. 클립보드가 비어있는 상태에는 붙여넣기를 할 수 없으며, 일부만 클립보드에 복사할 수는 없다. 또한, 클립보드에 있는 이모티콘 중 일부를 삭제할 수 없다. 화면에 이모티콘을 붙여넣기 하면, 클립보드에 있는 이모티콘의 개수가 화면에 추가된다.
영선이가 S개의 이모티콘을 화면에 만드는데 걸리는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 S (2 ≤ S ≤ 1000) 가 주어진다.
출력
첫째 줄에 이모티콘을 S개 만들기 위해 필요한 시간의 최솟값을 출력한다.
풀이
BFS(Breadth-First Search)을 사용하여 접근해보자.
기본적인 BFS 함수
# BFS 함수 정의
def bfs(graph, start, visited):
# 큐(Queue) 구현을 위해 deque 라이브러리 사용
queue = deque([start])
# 현재 노드를 방문 처리
visited[start] = True
# 큐가 빌 때까지 반복
while queue:
# 큐에서 하나의 원소를 뽑아 출력
v = queue.popleft()
print(v, end=' ')
# 해당 원소와 연결된, 아직 방문하지 않은 원소들을 큐에 삽입
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
답안 코드
from collections import deque
# goal = 1000
goal = int(input())
visited=[]
for _ in range(1001):
visited.append([False for _ in range(1001)])
queue = deque([[1,1,1]])
while queue:
value,cpy,t = queue.popleft()
if value == goal:
break
# delete
if value - 1 != 0:
new_v, new_cpy, new_t = value-1, cpy, t+1
if not visited[new_v][new_cpy]:
visited[new_v][new_cpy] = True
queue.append([new_v, new_cpy, new_t])
# ctrl +c
new_v, new_cpy, new_t = value, value, t+1
if not visited[new_v][new_cpy]:
visited[new_v][new_cpy] = True
queue.append([new_v, new_cpy, new_t])
# ctrl+v
if value + cpy < 1001:
new_v, new_cpy, new_t = value + cpy, cpy, t+1
if not visited[new_v][new_cpy]:
visited[new_v][new_cpy] = True
queue.append([new_v, new_cpy, new_t])
print(t)
[BFS 참고]
https://freedeveloper.tistory.com/373
728x90
반응형
'Algorithm' 카테고리의 다른 글
[백준] 1697번: 숨바꼭질 -파이썬 (0) | 2022.01.13 |
---|---|
[백준] 10845번: 큐 -파이썬 (1) | 2022.01.11 |
[프로그래머스] 로또의 최고 순위와 최저 순위 (0) | 2021.11.23 |
[백준] 2630번: 색종이 만들기 (재귀) (0) | 2021.02.24 |
부분집합(MS 인터뷰, DFS:완전탐색) (0) | 2021.02.05 |