기타/코딩테스트

프로그래머스 코딩테스트 lv2-다음 큰 숫자

DEV_HEO 2023. 2. 2. 14:27
320x100

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

 

프로그래머스

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

programmers.co.kr

 

반복문만 사용해서 문제를 풀었었지만 효율성에서 틀려서 새롭게 푼 코드

 

정확성은 맞지만 효율성이 틀린 답

 

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        String bi = Integer.toBinaryString(n);
        StringBuilder sb = new StringBuilder(bi);
        
        
        
        if(sb.indexOf("0") < 0){    // 111...1(0 0개)
            sb.insert(1, "0");
        }else {                     // 0 있음
            if(sb.indexOf("1", 1) < 0){
                sb.append("0");         // 100...0(1 1개)
            }else{
                int last1 = sb.lastIndexOf("1");
                int index01 = sb.lastIndexOf("01");
                
                if(index01 > -1){     // 1...01...(0있고 1 2개이상)
                    int index11after01 = sb.indexOf("11", index01);
                    if(index11after01 > -1){
                        String sub = sb.substring(0, index11after01 -1);
                        sb.replace(0, index11after01 +1, "");
                        sb.reverse();
                        sb.insert(0, sub);
                        sb.insert(sub.length(), "10");
                    }else{
                        sb.replace(last1-1, last1+1, "10");
                    }

                }else if(sb.indexOf("11") == 0){     // 11...1100..0
                    String sub = sb.substring(0, last1);
                    sb.replace(0, last1+1, "").insert(0, "10").append(sub);
                }
            }
        }
        
        
        answer = Integer.parseInt(sb.toString(), 2);
        return answer;
    }

}

 

 

 

 

 


 

아무리 해도 효율성에서 틀리길래  처음 푸는것 처럼 다시 문제를 풀어보았다.

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        String bi = Integer.toBinaryString(n);
        
        // 1의 개수
        String one = bi.replace("0", "");
        int cnt = one.length();

        String newBi = "";
        
        while(true){
            
            newBi = Integer.toBinaryString(++n);
            
            // 1의 개수
            one = newBi.replace("0", "");
            int newCnt = one.length();
            
            
            if(cnt == newCnt){
                break;
            }
        }
        
        
        answer = Integer.parseInt(newBi, 2);
        return answer;
    }

}

이렇게 간단하게 해결...

그 전에도 이런식으로 풀려고 했는데 분명히 어디선가 잘못 했을 것이다.

처음 문제 풀 때 부터 꼼꼼하게 풀자..

 

 

 


메소드를 사용하면 시간이 증가할 수 있다는 걸 알게 되어서 테스트 해보았다.

위에서 푼 정답에 1의 개수를 구하는 메소드를 사용하였다.

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        String bi = Integer.toBinaryString(n);
        
        // 1의 개수
        int cnt = getOneCnt(bi);

        String newBi = "";
        
        while(true){
            
            newBi = Integer.toBinaryString(++n);
            
            // 1의 개수
            int newCnt = getOneCnt(newBi);
            
            
            if(cnt == newCnt){
                break;
            }
        }
        
        
        answer = Integer.parseInt(newBi, 2);
        return answer;
    }
    
    public int getOneCnt(String bi){
        
        String one = bi.replace("0", "");
        int cnt = one.length();
        
        return cnt;
    }

}

 

결과는 효율성에서 하나 오버되었다.

코딩테스트에서는 메소드를 자제해야겠다.

 

 

320x100