알고리즘

[백준] 2475번 : 검증수 -JAVA

DoosanBaek 2024. 11. 13. 17:15


문제 분석 :

컴퓨터에 6자리 고유번호 할당, 고유번호 처음 5자리는 00000에서 99999사이의 숫자, 6번째는 검증수다.

‘검증수’는 고유번호 앞 5자리의 각 숫자를 제곱한 합을 10으로 나눈 나머지다.

제약 조건 :

  • 고유번호 처음 5자리는 00000부터 99999까지의 숫자
  • 검증수를 계산하기 위해 각 숫자를 제곱하고, 그 합을 10으로 나누어 나머지를 구한다.
  • 입력은 반드시 5자리 숫자로 주어진다.

의사 결정 :

  1. 고유번호의 처음 5자리 숫자를 입력받는다.
  2. 각 자리의 숫자를 분리하여 제곱한다.
  3. 제곱한 값을 모두 더한다.
  4. 더한 값을 10으로 나눈 나머지를 계산한다.
  5. 계산된 나머지를 검증수로 반환한다.
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int A = sc.nextInt();  // 첫 번째 정수를 입력받아 변수 A에 저장
        int B = sc.nextInt();  // 두 번째 정수를 입력받아 변수 B에 저장
        int C = sc.nextInt();  // 세 번째 정수를 입력받아 변수 C에 저장
        int D = sc.nextInt();  // 네 번째 정수를 입력받아 변수 D에 저장
        int E = sc.nextInt();  // 다섯 번째 정수를 입력받아 변수 E에 저장

        // 각 정수의 제곱을 구하고 그 합을 10으로 나눈 나머지를 계산
        int GumjeungRemainder = (A * A + B * B + C * C + D * D + E * E) % 10;

        System.out.println(GumjeungRemainder); // 출력

        sc.close(); // Scanner 닫기
    }
}

메모리: 17684 KB, 시간 : 184 ms

-> 팀 스터디 후, 더 좋은 코드로 리팩토링 해보기

Scanner를 사용하는것보다 BufferedReader를 사용하는것이 메모리도 적게 차지하고 시간도 적게 걸린다.

 팀 스터디 중, 가장 빠른 코드를 작성하셨던 팀원분의 코드를 보면

       - BufferedReader와 split을 이용해 입력값을 받는다.

          --> BufferedReader  > Scanner

       - *을 이용한 제곱을 계산하여 누적합을 구한다.

 -> Math.pow(num,2) 를 사용하면 결과는 double이 되며 나머지 코드 때문에 다시 int로 변환 해야 하므로 불필요한 단계가 추가되어 속도가 느려짐

 - 더 간단한 작업으로 num * num 은 추가 메소드 Math.pow() 호출을 방지해서 효율적이고 빠르게 만든다.
       - 최종적으로 합계를 10으로 나눈 나머지를 출력한다.

아래의 코드 처럼, BufferedReader를 사용하면 'BufferedReader'는 더 큰 데이터 덩어리를 한번에 읽어 입력이 많은 프로그램의 경우 더 빠르게 만든다. 'Scanner'는 입력을 더 작은 청크로 처리하고 내장된 구문 분석을 포함해서 성능이 저하된다.

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));
        // br.readLine().split(" ")을 통해 한 줄로 입력된 숫자들을 공백기준으로 분리
        String[] inputs = br.readLine().split(" ");

        int sum = 0;
        for (String input : inputs) {
            int num = Integer.parseInt(input);
            // math.pow()대신 * 사용
            // 간단한 정수제곱이고 불필요한 double 타입 변환을 줄이기 위해 사용
            sum += num * num;  // 제곱을 더하기
        }

        System.out.println(sum % 10);
    }
}

메모리: 17684 KB, 시간 : 184 ms  -> 메모리 14176 KB , 시간 104 ms 로 단축된다.