카테고리 없음

[백준 14226번] 이모티콘 - python

zzi_on2 2022. 6. 19. 12:44

문제 링크

풀이 

- bfs 풀이

큐에 ( 화면에 있는 이모티콘 개수, 클립모드에 있는 이모티콘 개수, 연산 횟수)를 넣어주고 

bfs 를 실행한다. 

visited[화면개수][클립보드개수]로 방문 표시를 한다. 

화면에 있는 이모티콘 개수가 s와 같으면 연산 횟수 return 

1. 클립보드에 저장할 경우 방문하지 않았으면 

큐에 (화면개수, 화면개수, 연산횟수 +1)을 넣어주고 방문 표시 

2. 화면에 붙여넣기 할 경우 방문하지 않았으면 

큐에 (화면개수 + 클립보드개수, 클립보드개수, 연산횟수 +1) 을 넣어주고 방문 표시 

3. 하나 삭제할 경우 방문하지 않았으면 

큐에 (화면개수-1, 클립보드개수, 연산횟수 +1)을 넣어주고 방문 표시하면 된다. 

from collections import deque 

def bfs():
    
    q = deque()
    # visited[화면 개수][클립보드 개수] 방문 표시 
    visited = [ [0] * (s+1) for _ in range(s+1) ] 
    visited[1][0] = True
    # (화면개수, 클립보드개수, 연산횟수 )
    q.append((1,0,0))
    
    while q :
        screen, board, cnt = q.popleft()
        
        # 화면에 있는 이모티콘 개수가 s개 이면 연산횟수 리턴 
        if screen == s :
            return cnt 
            
        # 클립보드에 저장 
        if not visited[screen][screen] :
            q.append((screen,screen, cnt+1))
            visited[screen][screen] = True
            
        # 화면에 붙여넣기 
        if screen + board < s+1 :
            if not visited[screen + board][board] :
                q.append((screen +board, board, cnt + 1))
                visited[screen+board][board] = True 
        
        # 화면의 이모티콘 하나 삭제하기 
        if screen -1 >= 0:
            if not visited[screen-1][board] :
                q.append((screen-1, board ,cnt +1))
                visited[screen-1][board] = True       
                
    return -1  
        
s = int(input())
print(bfs())

원래 처음에는 배열 크기를 1001 만큼 선언해주었는데, 런타임 에러가 발생하였다. 

크기를 s+1로 변경해주니 해결되었는데 왜 ?