TIL
[코테연습] 650. 2 Keys Keyboard
크라00
2024. 8. 19. 10:59
- 반복문 문제
https://leetcode.com/problems/2-keys-keyboard/description/?envType=daily-question&envId=2024-08-19
- 문제분석
1. int n 이 주어지고, 글자 'A' 가 있다고 한다.
2. 이때 n 이 특정 숫자 일 경우 2가지 액션을 취할 수 있다.
3. 첫번째는 'A' 를 copy 한다.
4. 두번째는 'A' 를 paste 한다.
5. 이 경우 n 에 충족하는 글자수를 만족할 수 있도록 가장 최소한의 copy , paste 숫자를 구하라.
- 문제풀이
1. 문제를 단순하게 반복하면 다음과 같다.
n = 3 // A, A, A
n = 4 // A, AA, AAAA
n = 5 // A, AA, AAA, AAAA, AAAAA
n = 6 // A, AA, AAA, AAAAAA
n = 7 // A, AA, AAA, AAAA, AAAAA, AAAAAA, AAAAAAAA
n = 8 // A, AA, AAAA, AAAAAAAAA
2. 마지막 글자가 'A' 가 연속된 n 의 글자 수라고 했을때, 이전 글자는 n 을 2~n 까지 나눈 숫자 중에 하나일 것이다.
3. 예를 들면 'A' 의 이전 글자를 구하고 싶다면
if ( n % 2 == 0 ) {
n/=2;
} else if (n%3 ==0) {
n/=3;
} else ...
로 반복될 것이다.
4. 반복된 횟수가 int count = 0 으로 초기화 했을때, while(n!=1) 일때까지 나눈 값을 count에 더하면 된다.
4-1. 나눈 값을 count 에 더한다면, n = 8 일때, n/=2 ==> n=4; count+=2;
4-2. n=4 n/=2; ==> n=2; count+=2;
4-3. n=2 n/=2; ==> n=1; count+=2;
4-4. count = 6이다.
4-4. copy 할때 한번, paste 할떄 1번씩 더해야하기 때문에 count 에 해당 행동을 더해준다.
5. 발화식은 다음과 같다.
n/=i;
count+=i;
class Solution {
/**
n = 3 // A, A, A
n = 4 // A, AA, AAAA
n = 5 // A, AA, AAA, AAAA, AAAAA
n = 6 // A, AA, AAA, AAAAAA
n = 7 // A, AA, AAA, AAAA, AAAAA, AAAAAA, AAAAAAAA
n = 8 // A, AA, AAAA, AAAAAAAAA
*/
public int minSteps(int n) {
int count = 0;
while( n != 1) {
for (int i = 2; i <= n; i++) {
if ( n % i == 0) {
n/=i;
count+=i;
break;
}
}
}
return count;
}
}