본문 바로가기

매일 TIL

[내일배움캠프 5-2일] 스쿼드 문제, A->B

A->B

문제 링크 : https://www.acmicpc.net/problem/16953

문제를 보자마자 거꾸로 푸는 문제라고 생각함.

로직을 짜기 위해 우선 직접 B를 바꾸는 과정을 생각해 봤다.

연산이 *2밖에 없기 때문에 B는 일의 자리가 1이거나 짝수여야 함.

즉 일의 자리가 1일 경우 제거해주고, 짝수일 경우 2로 계속 나누어주는 반복문을 구성.

1도 아니고 짝수도 아닌 경우 -1을 반환하면 된다.

def change_num(A, B):
    # 연산 횟수 초기화
    cnt = 0
    # B가 A와 같거나 작아질 때까지 반복
    while B > A:
        # B의 일의 자리가 1인 경우
        if B % 10 == 1:
            # 1을 제거한 수를 B에 저장
            B //= 10
            # 연산 +1
            cnt += 1
        else:
            # B가 짝수인 경우
            if B % 2 == 0:
                # B를 2로 나눈 후 저장
                B //= 2
                # 연산 +1
                cnt += 1
            else:
                return -1
    
    # 반복문 종료 후 B가 A와 같다면 cnt 출력
    if B == A:
        return cnt + 1
    # 같지 않고 넘어갔다면 실패
    else:
        return -1

change_num 함수를 만들었음.

1을 없앨 때와, 2로 나눌 때 연산을 하는 것이기 때문에 그 경우마다 +1.

while문을 탈출하는 조건은 B가 A와 같거나 작아지는 경우.

이 때 같다는 것은 B에서 역추적하여 A가 되었다는 것이므로 cnt+1을 반환하면 됨.

그렇지 않다는 것은 A가 되지 못한 경우이므로 실패. -1 반환.

 

# A -> B
# B에서 A가 될 때까지 거꾸로 연산
# Q : 일의 자리가 1인가?
# Yes : 수에서 1 제거
# No : 짝수면 2로 나누고 홀수라면 -1 리턴

A, B = map(int, input().split())

def change_num(A, B):
    # 연산 횟수 초기화
    cnt = 0
    # B가 A와 같거나 작아질 때까지 반복
    while B > A:
        # B의 일의 자리가 1인 경우
        if B % 10 == 1:
            # 1을 제거한 수를 B에 저장
            B //= 10
            # 연산 +1
            cnt += 1
        else:
            # B가 짝수인 경우
            if B % 2 == 0:
                # B를 2로 나눈 후 저장
                B //= 2
                # 연산 +1
                cnt += 1
            else:
                return -1

    # 반복문 종료 후 B가 A와 같다면 cnt 출력
    if B == A:
        return cnt + 1
    # 같지 않고 넘어갔다면 실패
    else:
        return -1

print(change_num(A, B))

전체 코드


오늘의 회고

3주차 진도를 쭉 나갔다. 스쿼드 문제는 둘 중 하나만 풀었음.
새로운 개념을 배우고 또 구현하는데 시간이 많이 걸렸다.

 

내일의 목표는 3주차 마무리 + 스쿼드 문제 풀기