본문 바로가기
Problem Solving/BOJ

[Greedy] 16953 A->B

by Bokoo14 2022. 12. 31.

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

 

16953번: A → B

첫째 줄에 A, B (1 ≤ A < B ≤ 109)가 주어진다.

www.acmicpc.net

# 2022.12.31
import sys
input = sys.stdin.readline

a, b = map(int, input().split())

cnt = 0

while (1):
    cnt+=1
    tmp = b

    if a==b:
        print(cnt)
        break
    if b%10==1:
        b//=10
    elif b%2==0:
        b//=2
        
    if tmp ==b:
        print("-1")
        break

a->b 로 푸는 것보다는 b->a로 생각하는게 더 쉽다

 

1. a==b가 될 때까지 cnt+=1

2. b의 제일 오른쪽 1을 빼는게 더 연산 횟수가 적다

3. 아니면 b를 2로 나누기

4. 오른쪽 1을 빼는 연산 or 2로 나누는 연산 둘 다 수행하지 못하면? -> 답이 없다!  -> -1을 출력

 

key point!

tmp에 계속 저장을 하면서 비교를 해주는 이유는 연산이 수행되었는지 확인하는 용도


틀린 코드

# 2022.12.31
import sys
input = sys.stdin.readline

a, b = map(int, input().split())

cnt = 0

while (a<=b):
    cnt+=1

    if a==b:
        print(cnt)
        break
    if b%10==1:
        b//=10
    elif b%2==0:
        b//=2
    else:
        print("-1")
        break

제일 밑의 부분을 else로 바꾸면 왜 안될까?

논리적으로 두 연산 모두 수행하지 못하면 답이 없기때문에 -1을 출력한다는 점은 동일한데 ...

[수정]

이렇게 하면 안되는 이유는 

4 42일때,

42->21->2
이렇게 계산되는데

a<=b에서 걸려서 바로 while문을 탈출하게 된다..

 

논리적으로 틀린 코드임..

'Problem Solving > BOJ' 카테고리의 다른 글

[DP] 1149 RGB거리  (0) 2023.01.01
[DFS] 11725 트리의 부모 찾기  (0) 2023.01.01
[Backtracking] 15666 N과 M(12)  (0) 2022.12.30
[Backtracking] 15663 N과 M(9)  (0) 2022.12.30
[Backtracking] 15657 N과 M(8)  (0) 2022.12.30