수박수박수박수?

출처 = 프로그래머스

문제

길이 10,000이하인 자연수인 n을 받아서 n의 길이만큼 “수박”을 리턴해라
ex) n = 3, answer = “수박수”

고민

크기가 작은 수가 들어오면 반복 돌며 “수”,”박”을 더하면 되지만
크기가 크면 클수록 연산 횟수가 많아지기 때문에 연산횟수를 줄여보기로 했다.

방법

숫자가 짝수면 2로 나누고 나눈횟수를 더한다.
홀수면 1을 빼고 나눗횟수를 총뺀 수에 더한다.
숫자가 2가 되면 “수박”을 나눗횟수만큼 두배로 만든다.

뺀 횟수는 위의 과정을 반복한다.

코드

[수박박박] []
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
32
33
public String solution(int n) {
//길이가 1이면 바로 "수"를 리턴
if(n <= 1) return n == 1 ? "수" : "";
//변수설정 뺀횟수, 곱할 수, 곱한 횟수
int plus = 0;
int multi = 1;
int multiCnt = 0;
StringBuffer sb = new StringBuffer("수박");
//n이 2가 될때까지 반복한다.
while (true) {
//n이 홀수면 1을 빼고 뺀 수에 1을 더한다.
if (n % 2 == 1) {
n--;
plus += multi;

//n이 짝수면서 2가 아니면 2로 나누고 곱할 수에 2를 곱하고 곱한 횟수에 1을 더한다
} else if (n % 2 == 0 && n != 2) {
n /= 2;
multi \*= 2;
multiCnt++;

//n이 2이면 "수박"을 만들고 곱한 횟수만큽 자기자신을 더한다.
} else if (n == 2) {

for (int i = 0; i < multiCnt; i++) {
sb.append(sb);
}
break;
}
}
//뺀 숫자는 위의 과정을 반복한다.
return sb.toString() + solution(plus);
}

결과

그냥 StringBuffer로 반복돌면서 더하는게 훨씬 빠르다!

[짧고 강하다] []
1
2
3
4
5
6
7
8
9
10
public String solution(int n) {

StringBuffer sb = new StringBuffer();
String[] arr = {"수","박"};
for(int i = 0; i < n; i++){
sb.append(arr[i%2]);
}
return sb.toString();

}

끝!

공유하기