
이것이 취업을 위한 코딩 테스트다 with 파이썬 : 취업과 이직을 결정하는 알고리즘 인터뷰 완벽
COUPANG
www.coupang.com
# 문제
어떠한 수 N이 1이 될 때까지 다음의 두 과정 중 하나를 반복적으로 선택하여 수행하려고 한다.
단, 두 번째 연산은 N이 K로 나누어 떨어질 때만 선택할 수 있다.
- N에서 1을 뺀다.
- N을 K로 나눈다.
예를 들어 N이 17, K가 4라고 가정하자. 이때 1번의 과정을 한 번 수행하면 N은 16이 된다.
이후에 2번의 과정을 두 번 수행하면 N은 1이 된다. 결과적으로 이 경우 전체 과정을 실행한 횟수는 3이 된다.
이는 N을 1로 만드는 최소 횟수이다.
N과 K가 주어질 때 1이 될 때까지 1번 혹은 2번의 과정을 수행해야 하는 최소 횟수를 구하는 프로그램을 작성하시오.
# 입력 조건
- 첫째 줄에 N(2 <= N <= 100,000)과 K(2<= K <= 100,000)가 공백으로 구분되며 각각 자연수로 주어진다.
이때 입력으로 주어지는 N은 항상 K보다 크거나 같다.
# 출력 조건
- 첫째 줄에 N이 1이 될 때까지 1번 혹은 2번의 과정을 수행해야 하는 횟수의 최솟값을 출력한다.
# 입력 및 출력 예시
- 입력 예시
25 5 - 출력 예시
2
# 소스코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.Scanner; | |
public class Greedy04 { | |
public static void main(String[] args) { | |
// 입력: n => 첫번째 값, k => 두번째 값 | |
Scanner sc = new Scanner(System.in); | |
int n = sc.nextInt(); | |
int k = sc.nextInt(); | |
// resultCount => n을 1이 될 때까지 몇번 나누었는지 횟수 세기 위해 있는 변수 | |
int resultCount = 0; | |
// while 반복문을 사용해 n이 1이 아니면 반복문이 실행 되도록 구현 | |
while(n != 1) { | |
// 1. n이 k로 나누어 떨어지면 | |
// 2. n을 k 로 나눈 값을 n에 할당 해준다. | |
// 3. resultCount의 값을 +1 해준다. | |
if(n % k == 0) { | |
n /= k; | |
resultCount++; | |
} else { | |
// n이 k로 나누어 떨어지지 않으면 -1 해준다. | |
n--; | |
} | |
} | |
System.out.println(resultCount); | |
} | |
} |
반응형