일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Cypress
- 태그된 유니온
- ESlint
- recoil
- Promise
- async/await
- Jest
- 타입 좁히기
- 결정 알고리즘
- 무한 스크롤
- 인터섹션
- 투포인터
- app router
- React
- TS
- autosize
- useAppDispatch
- dfs
- CORS
- 반공변성
- 공변성
- SSR
- RTK Query
- tailwind
- 이분 검색
- 호이스팅
- map
- CI/CD
- webpack
- 리터럴 타입
Archives
- Today
- Total
짧은코딩
1로 만들기 본문
반응형
비효율적으로 푼 내 풀이
#내가 풀어본 비효율적인 방식
from collections import deque
x = int(input())
answer = 0
q = deque([(x, 0), (x-1, 1)])
while True:
t = q.popleft()
nx = t[0]
count = t[1]
if nx == 1:
answer = count
break
if (nx % 5) == 0:
q.append((nx // 5, count+1))
q.append(((nx // 5) - 1, count+2))
if (nx % 3) == 0:
q.append(((nx // 3) - 1, count+2))
if (nx % 2) == 0:
q.append(((nx // 2) - 1, count+2))
print(answer)
나는 모든 경우의 수를 q에 담아 계산하는 방식으로 풀었다. 비슷한 문제가 백준에 있어서 풀어봤더니 런타임 에러가 떴다. 일단 예시에 나온 26을 입력하니 3이 나오기는 했다.
내 풀이가 틀린 이유는 동일한 연산이 반복되어 계산하는 것을 고려하지 않아서 그런거 같다.
교재 풀이
이 문제는 이런식으로 같은 함수가 여러번 나오게 된다.
-점화식
사용 가능한 연산에서 가장 작은 것을 구해야한다. 1을 더해주는 이유는 함수의 호출 회수를 구해주기 때문이다.
x = int(input())
d = [0] * 30001
for i in range(2, x+1):
d[i] = d[i - 1] + 1
if i % 2 == 0:
d[i] = min(d[i], d[i // 2] + 1)
if i % 3 == 0:
d[i] = min(d[i], d[i // 3] + 1)
if i % 5 == 0:
d[i] = min(d[i], d[i // 5] + 1)
print(d[x])
이 코드는 d 배열의 인덱스 번호에 들어가는 숫자가 결국 최소 연산 회수인 것이다. 이렇게 보텀업 방식을 사용하면 효율적으로 문제를 풀 수 있다.
반응형
'코딩 테스트(Python) > 이것이 취업을 위한 코딩 테스트다' 카테고리의 다른 글
바닥 공사 (0) | 2022.06.23 |
---|---|
개미 전사 (0) | 2022.06.21 |
다이나믹 프로그래밍 (0) | 2022.06.20 |
떡볶이 떡 만들기 (0) | 2022.06.16 |
부품 찾기 (0) | 2022.06.15 |
Comments