Notice
Recent Posts
Recent Comments
Link
04-27 17:38
«   2025/04   »
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 29 30
Archives
Today
Total
관리 메뉴

<<개발일지>>

[배열] 6. 뒤집은 소수 본문

코딩테스트

[배열] 6. 뒤집은 소수

개발하는지호 2023. 12. 17. 15:10
6. 뒤집은 소수
 

설명

N개의 자연수가 입력되면 각 자연수를 뒤집은 후 그 뒤집은 수가 소수이면 그 소수를 출력하는 프로그램을 작성하세요.

예를 들어 32를 뒤집으면 23이고, 23은 소수이다. 그러면 23을 출력한다. 단 910를 뒤집으면 19로 숫자화 해야 한다.

첫 자리부터의 연속된 0은 무시한다.

입력

첫 줄에 자연수의 개수 N(3<=N<=100)이 주어지고, 그 다음 줄에 N개의 자연수가 주어진다.

각 자연수의 크기는 100,000를 넘지 않는다.

출력

첫 줄에 뒤집은 소수를 출력합니다. 출력순서는 입력된 순서대로 출력합니다.

예시 입력 1 

9
32 55 62 20 250 370 200 30 100

예시 출력 1

23 2 73 2 3

 

 

 

<<풀이>>

-나의 풀이-

 

ㅋㅋ 일단 이 문제는 솔직히 좀 친숙하지 못했다. 그러다 보니 중구난방으로 풀었고, 예시만 정답이 나왔다.

내 풀이도 맞는거 같은데 어디서 틀린 것인지 파악이 되지 않는다.

 

 

import java.util.Scanner;
import java.util.Stack;

class Main {

    public int[] solution(int n, int[] arr) {
        StringBuilder sb = new StringBuilder();
        Stack<Integer> stack = new Stack<>();
        int[] brr = new int[n];
        int index = 0;
        for (int x : arr) {
           brr[index++] = Integer.parseInt(sb.append(String.valueOf(x)).reverse().toString());
           sb.setLength(0);
        }
        for (int c : brr) {
            int count = 0;
            for (int i = 2; i < 10; i++) {
                if ((c % i == 0 && c >= 10) || c == 1 )  count++;
            }
            if (count == 0) stack.push(c);
        }

        int stackSize = stack.size();
        int[] answer = new int[stackSize];

        for (int i = stackSize - 1; i >= 0; i--) {
            answer[i] = stack.pop();
        }

        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = in.nextInt();
        }

       for (int x : T.solution(n, arr)) {
           System.out.print(x + " ");
       }
    }
}

 

stack, stringBuilder 등등 많은 것들을 이용했다.

 

*stringBuilder 같은 경우 미리 정해둔 배열의 공간을 자유롭게 할 수 있게끔 하면서 메모리 공간을 효율적으로 사용할 수 있다.

하지만 이때, toString을 사용하게 되면 배열에 있던 모든 것들이 합쳐서 출력이 된다. 유용하지만, 상황에 맞지 않으면 원하는 결과 값을 얻지 못한다.

 

 

-강사님 풀이-

 

import java.util.ArrayList;
import java.util.Scanner;


class Main {

    public boolean isPrime(int n ){
        if (n == 1) return false;
        for (int i = 2; i < n; i++) {
            if (n % i == 0) return false;
        }

        return true;
    }

    public ArrayList<Integer> solution(int n, int[] arr) {
        ArrayList<Integer> list = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            int res = 0;
            int tmp = arr[i];
            while (tmp > 0) {
              int t = tmp % 10;
                res = res * 10 + t;
                tmp = tmp / 10;
            }
            if (isPrime(res)) list.add(res);
        }
        return list;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = in.nextInt();
        }

        for (int x : T.solution(n, arr)) {
            System.out.print(x + " ");
        }
    }
}

와 역시 너무 깔끔하다. 

 

ArrayList를 활용했고

 

특히나,

 

while (tmp > 0) {
    int t = tmp % 10;
    res = res * 10 + t;
    tmp = tmp / 10;
}

 

이 알고리즘이 돋 보인다.

숫자를 거꾸로 하는 여러 방법 중 이렇게 해도 된다.

 

최근 들어 감탄이 없었는데 오늘 또 한 대 맞고 간다 ㅋㅋ.

'코딩테스트' 카테고리의 다른 글

[배열] 8. 등수구하기  (0) 2023.12.18
[배열] 7. 점수 계산  (1) 2023.12.17
[배열] 5. 소수(에라토스테네스 체)  (1) 2023.12.14
[배열] 4. 피보나치 수열  (1) 2023.12.12
[배열] 3. 가위 바위 보  (0) 2023.12.12