개발/algorithm

[백준 14395번] 4연산 -python

zzi_on2 2022. 1. 27. 11:38

문제 링크

https://www.acmicpc.net/problem/14395

 

14395번: 4연산

첫째 줄에 정수 s를 t로 바꾸는 방법을 출력한다. s와 t가 같은 경우에는 0을, 바꿀 수 없는 경우에는 -1을 출력한다. 가능한 방법이 여러 가지라면, 사전 순으로 앞서는 것을 출력한다.  연산의 아

www.acmicpc.net

 

풀이 

- bfs 문제

- set()으로 방문 여부 확인 

- 연산자마다 우선 순위 고려하여 우선 순위가 높은 순서부터 큐에 삽입 

- 빼기 연산을 하게 되면 0이 되어 최종값을 만들 수 없으므로 고려하지 않아도 됨 

from collections import deque 

INF = int(10e9)

def bfs(s,t):

  check.add(s)

  q = deque()
  q.append((s,""))

  while q:
    num, result = q.popleft()
    
    # t와 같으면 결과 리턴 
    if num == t :
      return result 
      
    # 범위에 포함되고 방문한 적이 없으면 
    tmp = num*num
    if 0<= tmp <= INF and tmp not in check :
      q.append((tmp, result + "*"))
      check.add(tmp)
    
    tmp = num+num
    if 0<= tmp <= INF and tmp not in check :
      q.append((tmp, result + "+"))
      check.add(tmp)  
    
    # 나누기 연산하면 1이 됨 
    tmp = 1 
    if 1 not in check:
      q.append((tmp, result+"/"))
      check.add(1)

  return -1 

s, t = map(int,input().split())

# 방문 여부 확인 
check = set()

if s == t :
  print(0)
else :
  print(bfs(s,t))