티스토리 뷰

728x90

https://school.programmers.co.kr/learn/courses/30/lessons/17687

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

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();
    }
}
728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
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
글 보관함