티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/17687
2018 KAKAO BLIND RECRUITMENT 3차 Level 2 문제다.
n: 2, t: 4, m: 2, p: 1인 입출력 예시1에서, result는 0111이다.
각 숫자 순서대로 0의 2진수에서, 2의 2진수, 3의 2진수, 4의 2진수에서 뽑은 숫자들이다.
즉, 0~4까지를 2진수로 변환하면 result가 완성된다.
0~4까지의 2진수를 문자열로 늘어놓으면 011011100과 같다.
여기서 튜브는 1번째, 3번째, 5번째, 7번째 숫자를 말한 것이다.
말해야 할 숫자가 몇번째인지 규칙을 찾으면, p + m * ( n - 1 )이다.
첫번째로 숫자를 말할 때는 튜브의 순서와 같은 번째의 숫자를,
그 다음부터는 게임에 참가하는 인원 m을 더한 것과 같은 번째의 숫자를 말하면 된다.
StringBuilder sb에 0부터 n진수로 변환한 것을 append하고,
ans의 길이가 0이라면 sb의 p번째 숫자를 뽑아와야 하므로 idx를 p로 두고 sb.charAt(idx - 1)을 append했다.
그리고 ans의 길이가 0이 아니라면 p + m * (n - 1)번째 숫자를 뽑아와야 하므로 idx에 m씩 더해 append 했다.
(예를 들어 3번째 숫자를 뽑을 차례라면 p + m + m이므로 idx에 m을 누적하여 더함)
ans의 길이가 t가 넘을 때까지 위의 과정을 반복하면 된다.
n진수로 변경한 문자열을 하나하나 for문으로 돌고,
m으로 나눈 나머지가 p인 경우만 StringBuilder에 더하는 방식으로 해도 되지만
t나 m이 커지면 시간초과가 발생한다.
class Solution {
public String solution(int n, int t, int m, int p) {
StringBuilder ans = new StringBuilder();
StringBuilder sb = new StringBuilder();
int num = 0;
int idx = 0;
int len;
while(true) {
if(ans.length() >= t)
break;
sb.append(Integer.toString(num++, n));
len = sb.length();
if(ans.length() == 0 && len >= p) {
ans.append(sb.charAt(p - 1));
idx = p;
}
while(idx + m < len) {
idx += m;
ans.append(sb.charAt(idx - 1));
}
}
ans.setLength(t);
return ans.toString().toUpperCase();
}
}
'algorithm > programmers' 카테고리의 다른 글
[프로그래머스/자바] 압축 풀이 - 2018 KAKAO BLIND RECRUITMENT (0) | 2022.12.02 |
---|---|
[프로그래머스/자바] 파일명 정렬 풀이 - 2018 KAKAO BLIND RECRUITMENT (0) | 2022.12.01 |
[프로그래머스/자바] 셔틀버스 풀이 - 2018 KAKAO BLIND RECRUITMENT (0) | 2022.12.01 |
[프로그래머스/자바] 뉴스 클러스터링 풀이 - 2018 KAKAO BLIND RECRUITMENT (0) | 2022.11.30 |
[프로그래머스/자바] 프렌즈4블록 풀이 - 2018 KAKAO BLIND RECRUITMENT (0) | 2022.11.30 |