www.acmicpc.net/problem/1978

 

1978번: 소수 찾기

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

www.acmicpc.net

문제

주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.

입력

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

출력

주어진 수들 중 소수의 개수를 출력한다.

예제 입력 1

4

1 3 5 7

예제 출력 1

3

 

 

 

 

 

풀이 .

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static boolean isPrime(int num) {
        if(num == 2) return true;
        if(num == 0 || num == 1 || num % 2 == 0) return false;
        for(int i = 3; i <= Math.sqrt(num); i+=2) {
            if(num % i == 0) return false;
        }
        return true;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int cnt = 0;
        for(int i = 0; i < n; i++) {
            int num = Integer.parseInt(st.nextToken());
            if(isPrime(num)) cnt += 1;
        }
        System.out.println(cnt);
    }
}

www.acmicpc.net/problem/11576

 

11576번: Base Conversion

타임머신을 개발하는 정이는 오랜 노력 끝에 타임머신을 개발하는데 성공하였다. 미래가 궁금한 정이는 자신이 개발한 타임머신을 이용하여 500년 후의 세계로 여행을 떠나게 되었다. 500년 후의

www.acmicpc.net

문제

타임머신을 개발하는 정이는 오랜 노력 끝에 타임머신을 개발하는데 성공하였다. 미래가 궁금한 정이는 자신이 개발한 타임머신을 이용하여 500년 후의 세계로 여행을 떠나게 되었다. 500년 후의 세계에서도 프로그래밍을 하고 싶었던 정이는 백준 사이트에 접속하여 문제를 풀기로 하였다. 그러나 미래세계는 A진법을 사용하고 있었고, B진법을 사용하던 정이는 문제를 풀 수가 없었다. 뛰어난 프로그래머였던 정이는 A진법으로 나타낸 숫자를 B진법으로 변환시켜주는 프로그램을 작성하기로 하였다. 

N진법이란, 한 자리에서 숫자를 표현할 때 쓸 수 있는 숫자의 가짓수가 N이라는 뜻이다. 예를 들어 N은 17일 때 한 자릿수에서 사용할 수 있는 수는 0, 1, 2, ... , 16으로 총 17가지가 된다.

입력

입력의 첫 줄에는 미래세계에서 사용하는 진법 A와 정이가 사용하는 진법 B가 공백을 구분으로 주어진다. A와 B는 모두 2이상 30이하의 자연수다.

입력의 두 번째 줄에는 A진법으로 나타낸 숫자의 자리수의 개수 m(1 ≤ m ≤ 25)이 주어진다. 세 번째 줄에는 A진법을 이루고 있는 숫자 m개가 공백을 구분으로 높은 자릿수부터 차례대로 주어진다. 각 숫자는 0이상 A미만임이 보장된다. 또한 수가 0으로 시작하는 경우는 존재하지 않는다.

A진법으로 나타낸 수를 10진법으로 변환하였을 때의 값은 양의 정수이며 220보다 작다.

출력

입력으로 주어진 A진법으로 나타낸 수를 B진법으로 변환하여 출력한다.

예제 입력 1

17 8

2

2 16

예제 출력 1

6 2

 

 

 

 

 

 

풀이 .

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(br.readLine());

        int[] aArr = new int[m];
        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < m; i++) {
            aArr[i] = Integer.parseInt(st.nextToken());
        }

        int idx = 0, decimal = 0;
        for(int i = m - 1; i >= 0; i--) {
            decimal += aArr[idx++] * Math.pow(a, i);
        }

        int[] bArr = new int[20];  // decimal은 2^20 미만으로 보장됨
        idx = 0;
        while(decimal != 0) {
            bArr[idx++] = decimal % b;
            decimal /= b;
        }

        for(int i = idx - 1; i >= 0; i--) {
            System.out.print(bArr[i] + " ");
        }
    }
}

 

www.acmicpc.net/problem/2089

 

2089번: -2진수

-2진법은 부호 없는 2진수로 표현이 된다. 2진법에서는 20, 21, 22, 23이 표현 되지만 -2진법에서는 (-2)0 = 1, (-2)1 = -2, (-2)2 = 4, (-2)3 = -8을 표현한다. 10진수로 1부터 표현하자면 1, 110, 111, 100, 101, 11010, 110

www.acmicpc.net

문제

-2진법은 부호 없는 2진수로 표현이 된다. 2진법에서는 20, 21, 22, 23이 표현 되지만 -2진법에서는 (-2)0 = 1, (-2)1 = -2, (-2)2 = 4, (-2)3 = -8을 표현한다. 10진수로 1부터 표현하자면 1, 110, 111, 100, 101, 11010, 11011, 11000, 11001 등이다.

10진법의 수를 입력 받아서 -2진수를 출력하는 프로그램을 작성하시오.

입력

첫 줄에 10진법으로 표현된 수 N이 주어진다.

출력

-2진법 수를 출력한다.

제한

  • -2,000,000,000 ≤ N ≤ 2,000,000,000

예제 입력 1

-13

예제 출력 1

110111

 

 

 

 

 

 

풀이 .

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        if(n == 0) {
            System.out.println(0);
            return;
        }

        int[] arr = new int[100];
        int idx = -1;
        while(n != 1) {
            if(n < 0) {
                if((n*-1) % 2 == 1) {  // 음홀
                    n = n / -2 + 1;
                    arr[++idx] = 1;
                }else {  // 음짝
                    n = n / -2;
                    arr[++idx] = 0;
                }
            }else {
                if(n % 2 == 1) {  // 양홀
                    n = n / -2;
                    arr[++idx] = 1;
                }else {  // 양짝
                    n = n / -2;
                    arr[++idx] = 0;
                }
            }
        }
        arr[++idx] = 1;
        for(int i = idx; i >= 0; i--) {
            System.out.print(arr[i]);
        }
    }
}

 

양수 홀짝, 음수 홀짝 경우를 나누어 계산해야 한다.

예제 입력을 손으로 풀어보고 그에 맞추어서 짜자.

www.acmicpc.net/problem/1212

 

1212번: 8진수 2진수

첫째 줄에 8진수가 주어진다. 주어지는 수의 길이는 333,334을 넘지 않는다.

www.acmicpc.net

문제

8진수가 주어졌을 때, 2진수로 변환하는 프로그램을 작성하시오.

입력

첫째 줄에 8진수가 주어진다. 주어지는 수의 길이는 333,334을 넘지 않는다.

출력

첫째 줄에 주어진 수를 2진수로 변환하여 출력한다. 수가 0인 경우를 제외하고는 반드시 1로 시작해야 한다.

예제 입력 1

314

예제 출력 1

11001100

 

 

 

 

 

 

풀이 .

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String n = br.readLine();

        String[] binary = {"000", "001", "010", "011", "100", "101", "110", "111"};
        for(int i = 0; i < n.length(); i++) {
            int octa = n.charAt(i) - '0';
            String bin = binary[octa];

            if(i == 0) {
                if(bin.startsWith("000")) {
                    System.out.print("0");
                }else if(bin.startsWith("00")) {
                    System.out.print(bin.charAt(2));
                }else if(bin.startsWith("0")) {
                    System.out.print(bin.charAt(1));
                    System.out.print(bin.charAt(2));
                }else {
                    System.out.print(bin);
                }

            }else {
                System.out.print(bin);
            }
        }
    }
}

www.acmicpc.net/problem/1373

 

1373번: 2진수 8진수

첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.

www.acmicpc.net

문제

2진수가 주어졌을 때, 8진수로 변환하는 프로그램을 작성하시오.

입력

첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 주어진 수를 8진수로 변환하여 출력한다.

예제 입력 1

11001100

예제 출력 1

314

 

 

 

 

 

 

풀이 .

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String n = br.readLine();

        if(n.length() % 3 == 1) {
            n = "00" + n;
        }else if(n.length() % 3 == 2) {
            n = "0" + n;
        }

        ArrayList<Integer> binaryList = new ArrayList<>();
        for(int i = n.length() - 1; i >= 0; i--) {
            binaryList.add(n.charAt(i) - '0');
        }

        ArrayList<Integer> octaList = new ArrayList<>();
        for(int i = 0; i < binaryList.size(); i+=3) {
            int octa = binaryList.get(i) * (int)Math.pow(2, 0);
            octa += binaryList.get(i+1) * (int)Math.pow(2, 1);
            octa += binaryList.get(i+2) * (int)Math.pow(2, 2);
            octaList.add(octa) ;
        }
        Collections.reverse(octaList);

        for(int octa : octaList) {
            System.out.print(octa);
        }
    }
}

 

mod 3에 따라 String의 길이를 늘려주고 시작하는 게 핵심

'알고리즘 문제 > 백준 온라인 저지' 카테고리의 다른 글

[BOJ] 2089 - -2진수 JAVA  (0) 2021.01.16
[BOJ] 1212 - 8진수 2진수 JAVA  (0) 2021.01.16
[BOJ] 2745 - 진법 변환 JAVA  (0) 2021.01.16
[BOJ] 11005 - 진법 변환 2 JAVA  (0) 2021.01.16
[BOJ] 9613 - GCD 합 JAVA  (0) 2021.01.15

www.acmicpc.net/problem/2745

 

2745번: 진법 변환

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 

www.acmicpc.net

문제

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)

B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.

출력

첫째 줄에 B진법 수 N을 10진법으로 출력한다.

예제 입력 1

ZZZZZ 36

예제 출력 1

60466175

 

 

 

 

 

 

풀이 .

import java.io.*;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        String N = st.nextToken();
        int B = Integer.parseInt(st.nextToken());

        ArrayList<Character> cList = new ArrayList<>();
        for(int i = N.length() - 1; i >= 0; i--) {
            cList.add(N.charAt(i));
        }

        int decimal = 0;
        for(int i = 0; i < cList.size(); i++) {
            int num = 0;
            char ch = cList.get(i);
            if('0' <= ch && ch <= '9') {
                num = ch - '0';
            }else {
                num = ch - 55;
            }
            decimal += num * Math.pow(B, i);
        }
        System.out.println(decimal);
    }
}

www.acmicpc.net/problem/11005

 

11005번: 진법 변환 2

10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를

www.acmicpc.net

문제

10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.

출력

첫째 줄에 10진법 수 N을 B진법으로 출력한다.

예제 입력 1

60466175 36

예제 출력 1

ZZZZZ

 

 

 

 

 

풀이 .

import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
        int N = Integer.parseInt(st.nextToken());
        int B = Integer.parseInt(st.nextToken());

        // A ~ Z : 65 ~ 90
        char[] arr = new char[36];
        for(int i = 0; i <= 35; i++) {
            if(i < 10) {
                arr[i] = (char)(i + '0');
            }else {
                arr[i] = (char)(i + 55);
            }
        }

        ArrayList<Integer> list = new ArrayList<>();
        while(N != 0) {
            int mod = N % B;
            list.add(mod);
            N = N / B;
        }
        Collections.reverse(list);

        for(int mod : list) {
            sb.append(arr[mod]);
        }
        bw.write(sb.toString());
        br.close();
        bw.flush();
        bw.close();
    }
}

 

그냥 구현하면 된다.

스프링에서 빈 생명주기 콜백을 지원하는 방법은 3가지가 있다.

 

1. 인터페이스(InitializingBean, DisposableBean)  

public class NetworkClient implements InitializingBean, DisposableBean {

    private String url;
    public NetworkClient() {
        ...
    }

    // 서비스 시작시 호출
    public void connect() {
        ...
    }

    public void call() {
        ...
    }

    // 서비스 종료시 호출
    public void disconnect() {
        ...
    }

    @Override  // 의존성 주입 이후에 실행 (InitializingBean)
    public void afterPropertiesSet() throws Exception {
        connect();
        call();
    }

    @Override  // 빈 소멸 전 호출 (DisposableBean)
    public void destroy() throws Exception {
        disconnect();
    }
}

 관련 로직은 직접 구현해야 한다

 

-> 요즘은 별로 사용하지 않는 방식이다.

 

 

 

 

2. 설정 정보에 초기화 메서드, 종료 메서드 지정

public class NetworkClient {

    private String url;
    public NetworkClient() {
        ...
    }

    // 서비스 시작시 호출
    public void connect() {
        ...
    }

    public void call() {
        ...
    }

    // 서비스 종료시 호출
    public void disconnect() {
        ...
    }

    public void init() {
        connect();
        call();
    }

    public void close() {
        disconnect();
    }
}

.
.
.

@Configuration
static class LifeCycleConfig {

    // networkClient.init(), networkClient.close() 를 초기화, 소멸자 메서드로 사용한다 
    @Bean(initMethod = "init", destroyMethod = "close")
    public NetworkClient networkClient() {
    	NetworkClient networkClient = new NetworkClient();
        return networkClient;
    }
}

 

@Bean() 에서 속성을 줄 수 있다.

@Component에 적용시키니까 컴파일 에러가 발생한다. 아마 자동 등록에서는 쓸 수 없는 방식인 듯?

 

코드에 직접적으로 변화를 주는 것이 아니라 설정 정보(@Configuration)를 사용하는 것이기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있게 된다.

 

 

 

3. @PostConstruct, @PreDestory (이걸 쓰면 된다)

public class NetworkClient {

    private String url;
    public NetworkClient() {
        ...
    }

    // 서비스 시작시 호출
    public void connect() {
        ...
    }

    public void call() {
        ...
    }

    // 서비스 종료시 호출
    public void disconnect() {
        ...
    }

    @PostConstruct
    public void init() {
        connect();
        call();
    }

    @PreDestroy
    public void close() {
        disconnect();
    }
}

 

해당 메서드들에 직접적으로 어노테이션을 달아주면 된다.

(클래스에 직접 적용된 코드이니 당연히 @Componenet를 써도 잘 돌아간다)

 

스프링에서 직접 권장하는 방식이므로 그냥 이걸 사용하자.

 

코드를 직접적으로 추가해야 하기 때문에 외부 라이브러리에는 적용이 불가능하다. 외부 라이브러리에 대해서는 2번 방식(@Bean(initMethod = "init", destroyMethod = "close"))을 사용해야 한다.

+ Recent posts