Algorithm/백준

백준 29728 실버와 소수는 둘다 S로 시작한다

chbong 2024. 7. 26. 15:09
package practice;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Deque;
import java.util.LinkedList;

public class Boj29728 {
    public static boolean[] prime;

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        Deque<String> dq = new LinkedList<>();
        boolean chk = true;
        int N = Integer.parseInt(br.readLine());
        int amountB = 0;
        int amountS = 0;
        if(N > 1) {
            make_prime(N);

            extracted(chk, dq, amountB, amountS);
        }else{
            System.out.println("1 0");
        }


    }

    private static void extracted(boolean chk, Deque<String> dq, int amountB, int amountS) {
        for (int i = 1; i < prime.length; i++) {
            if (prime[i] == false) {    // 소수(false)일 경우 출력
                if (chk) {
                    if (dq.peekLast().equals("B")) {
                        dq.pollLast();
                        dq.offer("S");
                        dq.offer("S");
                    } else {
                        dq.offer("S");
                        chk = !chk;
                    }
                } else {
                    if (dq.peekFirst().equals("B")) {
                        dq.pollFirst();
                        dq.offerFirst("S");
                        dq.offerFirst("S");
                    } else {
                        dq.offerFirst("S");
                        chk = !chk;
                    }

                }
            }else{
                if(chk){
                    dq.offer("B");
                }else{
                    dq.offerFirst("B");
                }
            }

        }
        for (String s : dq) {
            if (s.equals("B")){
                amountB++;
            }else{
                amountS++;
            }
        }
        System.out.println(amountB + " " + amountS);
    }


    // N 이하 소수 생성 메소드
    public static void make_prime(int N) {

        prime = new boolean[N + 1];
        if(N < 2) {
            return;
        }
        prime[0] = prime[1] = true;


        // 제곱근 함수 : Math.sqrt()
        for(int i = 2; i <= Math.sqrt(N); i++) {

            // 이미 체크된 배열이면 다음 반복문으로 skip
            if(prime[i] == true) {
                continue;
            }

            // i 의 배수들을 걸러주기 위한 반복문
            for(int j = i * i; j < prime.length; j = j+i) {
                prime[j] = true;
            }
        }

    }

}