코딩 테스트/Baekjoon

S2 16953. A → B

  • -
728x90
반응형

문제 보기 :  16953번: A → B


문제

  • 정답률 : 39%


작성 코드

# 입력값을 받음 (시작 값 n, 목표 값 m)
n, m = map(int, input().split())

answer = -1  # 결과 초기화
visited = set()  # 방문한 노드를 기록할 집합
visited.add(n)  # 시작 노드를 방문 처리

from collections import deque
dd = deque([(n, 1)])  # BFS를 위한 큐 (현재 값, 연산 횟수)

while dd:
    now, cal = dd.popleft()  # 큐에서 현재 값과 연산 횟수를 꺼냄
    
    if now == m:  # 목표 값에 도달한 경우
        answer = cal  # 결과에 연산 횟수 저장
        break

    # 다음 가능한 상태 계산
    can = (now * 2, (now * 10) + 1)
    for c in can:
        if 0 <= c <= m and c not in visited:  # 범위 내 값이며 방문하지 않은 경우
            visited.add(c)  # 방문 처리
            dd.append((c, cal + 1))  # 다음 상태를 큐에 추가

# 결과 출력 (목표에 도달하지 못하면 -1)
print(answer)

풀이

1. 시작 값 n과 목표 값 m을 입력받아 BFS 탐색을 통해 최소 연산 횟수를 계산한다.

2. BFS를 위한 큐를 초기화하고, 방문한 노드는 set을 이용해 기록하여 중복 계산을 방지한다.

3. 큐에서 현재 값과 연산 횟수를 꺼내, 목표 값 m에 도달하면 연산 횟수를 결과로 저장하고 종료한다.

4. 현재 값에서 가능한 다음 상태 (값 * 2)와 (값 * 10 + 1)을 계산하고, 범위 내에서 아직 방문하지 않은 경우만 큐에 추가한다.

5. BFS가 종료되면 결과를 출력하며, 목표 값에 도달하지 못한 경우 1을 출력한다.

320x100
728x90

'코딩 테스트 > Baekjoon' 카테고리의 다른 글

S3 13305. 주유소  (0) 2025.01.03
G5 9251. LCS  (0) 2024.12.31
S2 6603. 로또  (0) 2024.12.31
S3 15657. N과 M (8)  (0) 2024.12.30
S1 1991. 트리 순회  (0) 2024.12.29
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.