Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 30 | 31 |
Tags
- Go언어
- android
- 알고리즘
- 개발자
- 이펙티브코틀린
- swift map
- 안드로이드
- Firebase
- android compose
- 프로그래머스
- 이펙티브 코틀린
- 코틀린
- 코루틴
- Swift 문법
- 안드로이드 다이얼로그
- RxJava
- Kotiln
- Java
- RxKotiln
- 안드로이드 컴포즈
- 일상
- Flutter
- react
- Dev6
- 코딩테스트
- 반응형 프로그래밍
- 잡담
- MVVM
- Rxjava 안드로이드
- 안드로이드 개발자
Archives
- Today
- Total
최데브는 오늘도 프로그래밍을 한다.
1이 될때까지 최소 연산 횟수 본문
반응형
n과 k 라는 자연수가 주어진다고 하면 아래 두가지 연산 중 하나씩 진행하여 n이 1이 되도록 하는데
연산 횟수를 최소화 하는 알고리즘을 작성하라.
1. n 에서 1을 빼기
2. n 에서 k를 나누기
이런 문제가 있다고 하자.
이 문제는 그리디 알고리즘의 유명한 문제다.
해설을 보기전 나의 경우는
n = 25
k = 5
count = 0
while 1 :
if n%k ==0:
n=n/k
count+=1
else :
count+=1
n= n-1
if n==1 :
break
print(count)
이런 식으로 풀었다. 이 방법도 틀린 방법은 아니지만 주어지는 숫자의 범위가 커지면 문제가 생길 수 있다.
그래서 사용하는 테크닉이 해설 코드에 있었다.
n = 17
k = 4
count = 0
while 1 :
# N이 K로 나누어 떨어지는 수가 될 때까지 뺴기
target = (n//k)*k
count += (n-target)
n = target
# N이 K보다 작을 때 (더 이상 나눌 수 없을 때) 반복문 탈출
if n<k:
break
# K로 나누기
count +=1
n//=k
# 마지막으로 남ㅇ느 수에 대하여 1씩 빼기
count += (n-1)
print(count)
target = (n//k)*k
count += (n-target)
이 부분이 핵심인데 첫번째 줄 코드를 실행하면 "n이 k와 나누어 떨어지는 숫자중 현재 n과 가장 큰접한 숫자" 를
구할 수 있게 된다.
반응형
'알고리즘' 카테고리의 다른 글
프로그래머스 - 신고 결과 받기 (0) | 2022.03.21 |
---|---|
알고스팟 - 소풍 (0) | 2020.06.15 |
알고스팟 - 보글게임(무식하게 풀기방법만 적용) (0) | 2020.06.15 |
프로그래머스 - 네트워크 (0) | 2020.04.19 |
프로그래머스 - 다리를 지나는 트럭 (0) | 2020.04.19 |
프로그래머스 - 가장 큰 수 (0) | 2020.04.13 |
프로그래머스 - 정수 삼각형 (0) | 2020.04.12 |
프로그래머스 - 큰 수 만들기 (0) | 2020.04.12 |
Comments