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주차 마무리 + 스쿼드 문제 풀기
'매일 TIL' 카테고리의 다른 글
[내일배움캠프 5-4일] 코드카타 문제, CS 특강, 스쿼드 문제 (0) | 2024.07.25 |
---|---|
[내일배움캠프 5-3일] 동적 계획법, 유기농 배추 리뷰 (2) | 2024.07.24 |
[내일배움캠프 5-1일] 스쿼드 문제, dfs, bfs, 섬 개수 세기 (1) | 2024.07.22 |
[내일배움캠프 4-5일] 코드카타 문제, 스쿼드 문제, bfs (0) | 2024.07.19 |
[내일배움캠프 4-4일] N-Queen, 백트래킹 (0) | 2024.07.18 |