문제
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
입력
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
출력
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
예제 입력 1 복사
2
예제 출력 1 복사
1
예제 입력 2 복사
10
예제 출력 2 복사
3| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import sys input = sys.stdin.readline N = int(input().strip()) cnt = 0 def divide(num): global cnt if num == 1: return elif num % 3 == 1: cnt += 1 return divide(num - 1) elif num % 3 == 2: cnt += 1 if num % 2 == 0: return divide(num // 2) else: return divide(num - 1) elif num % 3 == 0: cnt += 1 return divide(num // 3) divide(N) print(cnt) |
이거 테스트케이스는 다 맞는데 틀렸다고 나오는데 어디에서 문제일까요 ㅠㅠ?
그냥 논리대로 해보면 틀렸다는걸 알 수 있을텐데; 내가 푼 문제라서 알고 있음
그리고 이건 6의 배수일 때 2로 나누는게 3으로 나누는 것보다 낫다는걸 확실하게 장담할 수가 없음. 그래서 재귀보단 DP 테이블로 N 이하를 꽉 채운 다음에 돌아가는게 맞다고 생각함.
DP 카테고리에 있는 문제긴한데 탑다운으로 하면 재귀로 하길래 생각나는게 일단 재귀라 재귀로 해봤는데 바텀업 방법을 익혀봐야겠네요 ㅠ 감사합니다
사실 재귀 풀이도 가능할텐데 내가 푼 방식 밖에 안 보임 ㅋ
감사합니다 공부 더 해봐야겠네요
저거 그냥 브루트포스로도 풀리던데
아 아니였네