[프로그래머스 - 자바(JAVA)] 36 : k진수에서 소수 개수 구하기 | 다음 큰 숫자

서예진·2024년 3월 11일
0

목차

▶️ k진수에서 소수 개수 구하기
▶️ 다음 큰 숫자


✅ k진수에서 소수 개수 구하기 : Lv.2

▼ 문제

출처 : 프로그래머스 코딩테스트 연습 > 2022 KAKAO BLIND RECRUITMENT > k진수에서 소수 개수 구하기

▼ 내 풀이

  • 우선, 주어진 숫자 n을 k진수로 변환해줘야한다.
  • 그러기 위해서 Integer.toString() 메서드를 사용했다.
  • k진수로 변환한 후, 0을 기준으로 분할했다.
  • 또한, 소수 판별하는 과정을 거쳐야하기 때문에 소수 판별 메서드도 만들었다.
[오답 코드]
class Solution {
    public int solution(int n, int k) {
        int answer = 0;
        
        String result = Integer.toString(n, k);
        String[] arr = result.split("0");
        
        for (int i = 0; i < arr.length; i++) {
            if(!arr[i].isEmpty()){
                int num = Integer.valueOf(arr[i]);
                if(isPrime(num)) {
                    answer++;
                }
            }
        }
        
        return answer;
    }
    public boolean isPrime(int num) {
        if (num < 2) {
            return false;
        }
        int sqrt = (int) Math.sqrt(num);
        for (int i = 2; i <= sqrt; i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }
}
  • 제출 결과 1번, 11번 테스트 케이스에서 런타임 에러가 떴다.
  • 찾아보니 n의 최댓값이 백만이라 2진수로 변환하거나 하면 길이가 int 범위를 넘어가기 때문에 String값을 Integer.valueOf 하면 오버플로우 발생한다.
  • 따라서 이 값을 long 타입에 Long.parseLong()으로 받아줘야 한다.
  • 수정한 코드는 아래와 같다.
[수정 코드]
class Solution {
    public int solution(int n, int k) {
        int answer = 0;
        
        String result = Integer.toString(n, k);
        String[] arr = result.split("0");
        
        for (int i = 0; i < arr.length; i++) {
            if(!arr[i].isEmpty()){
                long num = Long.parseLong(arr[i]);
                if(isPrime(num)) {
                    answer++;
                }
            }
        }
        
        return answer;
    }
    public boolean isPrime(long num) {
        if (num < 2) {
            return false;
        }
        int sqrt = (int) Math.sqrt(num);
        for (int i = 2; i <= sqrt; i++) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }
}

✅ 다음 큰 숫자 : Lv.2

▼ 문제

출처 : 코딩테스트 연습 > 연습문제 > 다음 큰 숫자

▼ 내 풀이

  • 2진수 변환에 있어서 위 문제에서 사용했던 Integer.toString()메서드를 사용했다.
  • 우선 주어진 숫자 n에 대하여 2진수 변환과 1의 수를 count 해준다.
  • while문을 활용하여 n+1을 하면서 해당 수를 2진수 변환했을 때 1의 수가 n과 같다면 while문을 멈추게 했다.
class Solution {
    public int solution(int n) {
        int answer = 0;
        boolean check = true;
        String result = Integer.toString(n, 2);
        int nOneCnt = countOne(result);
        
        while(check) {
            n++;
            String temp = Integer.toString(n, 2);
            if (nOneCnt == countOne(temp)) {
                check = false;
            }
        }
        return n;
    }
    public int countOne(String s) {
        int cnt = 0;
        
        for(int i = 0; i < s.length(); i++) {
            if(s.charAt(i) == '1') {
                cnt++;
            }
        }
        return cnt;
    }
}

profile
안녕하세요

0개의 댓글