👀 문제
https://programmers.co.kr/learn/courses/30/lessons/12899
👊 도전
1. 설계
- 숫자를 3으로 나누며 나머지에 따라 적절한 숫자를 붙인다.
2. 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.*;
/**
*
* @author HEESOO
*
*/
class Solution {
public String solution(int n) {
String answer = "";
String[] s={"4","1","2"};
int rest=0; // 나머지
StringBuilder sb=new StringBuilder();
while(n>0){
rest=n%3;
n/=3;
if(rest==0){ // 나머지가 0이면 n--
n-=1;
}
sb.insert(0, s[rest]); // 문자열 맨 앞에 추가
}
return sb.toString();
}
}
3. 결과
🤟 성공 🤟
처음에 중복 순열, 나름 dp로 문제를 풀었으나 효율성에서 죄다 0점을 맞아… 다른 사람의 코드를 참고하였다. 하긴 n이 5억 이하니까 규칙이 있어야만 한다(?).
4. 설명
- n을 3으로 나머지 연산한다
- n=1일때 124연산 값은 1이다. n%3=1이므로 나머지가 1이 되면 124연산에서 1을 사용함을 알 수 있따. 2도 같은 방식이다.
- n=3이면 나머지가 0인데, 이때 124연산에서는 4를 채택한다. 따라서 배열 인덱스 번호에 맞게 {4,1,2}를 저장하고 코드 수행 나머지에 맞는 인덱스 번호를 찾아 값을 사용하면 된다.
- 또한, 나머지가 0이면 다음 계산에서 조금 변경이 필요하다. n=6이면 rest(나머지)=6%3=0이므로 4를 채택하고, n은 2(n/3)로 갱신된다. 이를 다시 나머지 연산하면 2를 채택하므로 틀린다. 2가 아닌 그 전의 값을 가져와야 한다. 따라서 n-=1로 하나 줄여야 한다.
- 수행되는 값은 sb의 맨 앞에 계속 붙여야 한다. 따라서 sb.insert() 메소드를 이용한다. 메소드의 첫 번째 파라미터는 붙일 인덱스 위치(우리는 맨 앞에 붙이는 것이니까 0), 다음은 붙일 값이다.