미운 오리 새끼의 우아한 개발자되기

[백준 #2577] 숫자의 개수 (java) 본문

Coding Test/오답노트

[백준 #2577] 숫자의 개수 (java)

Serina_Heo 2022. 3. 3. 15:06

1. 나의 정답

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 A = Integer.parseInt(br.readLine());
        int B = Integer.parseInt(br.readLine());
        int C = Integer.parseInt(br.readLine());
        int[] arr = new int[10];
        long num = A*B*C;

        while(num/10 > 0) {
            if(num%10 == 0) {
                arr[0]++;
            } else if (num%10 == 1) {
                arr[1]++;
            } else if (num%10 == 2) {
                arr[2]++;;
            } else if (num%10 == 3) {
                arr[3]++;;
            } else if (num%10 == 4) {
                arr[4]++;;
            } else if (num%10 == 5) {
                arr[5]++;;
            } else if (num%10 == 6) {
                arr[6]++;;
            } else if (num%10 == 7) {
                arr[7]++;;
            } else if (num%10 == 8) {
                arr[8]++;;
            } else if (num%10 == 9) {
                arr[9]++;;
            }
            num /= 10;
        }

        for(int i =0; i<arr.length; i++)
            if(num == i)
                arr[i]++;

        for(int a : arr)
            System.out.println(a);
    }
}

진짜 직관적인(?) 나의 코드 ^^...

좋은 생각이 안떠올라서 일단 맞추고 다른 사람들의 정답을 분석해보기로 했다.

 

2. 다른 사람 정답(1)

import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner in = new Scanner(System.in);

        int value = (in.nextInt()*in.nextInt()*in.nextInt());
        String str = Integer.toString(value);
        in.close();

        for(int i=0; i < 10; i++) {
            int count = 0;
            for(int j=0; j < str.length(); j++) {
                // char -> int 해주는 방법은 '0'을 빼주는 것
                if((str.charAt(j) - '0') == i) {
                    count++;
                }
            }
            System.out.println(count);
        }
    }
}

여기서 퍼온 코드인데..

일단 나는 char -> int로 바꿔줄 때 '0'을 빼줘야한다는 사실 조차 몰랐다 ㅋㅋㅋㅋ

그리고 난 배열에 답들을 담을 생각을 했는데

이 코드를 보면 그냥 count 변수에 값을 담아 바깥 for 문이 돌 때 마다 출력했다.. 

근데 이중 for문이라 시간복잡도가 O(n^2)임..

 

2. 다른 사람 정답(2)

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[] arr = new int[10];
        int val = Integer.parseInt(br.readLine())
                * Integer.parseInt(br.readLine())
                * Integer.parseInt(br.readLine());

        String str = String.valueOf(val);

        for(int i=0; i<str.length(); i++)
            arr[(str.charAt(i) - 48)]++;

        for(int v : arr)
            System.out.println(v);
    }
}

 

일단 BufferedReader가 Scanner에 비해 더 우수한 성능을 가지고 있다고 한다.

백준은 오늘 처음으로 풀어봐서.. 기존에 풀던 프로그래머스와는 다르게 입력부터 다 받아야해서 입력 받는 부분이 아직 익숙하지 않다..

위의 코드는 for문이 하나라서 시간 복잡도가 O(n)..

 

2. 다른 사람 정답(3)

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[] arr = new int[10];
        int val = Integer.parseInt(br.readLine())
                * Integer.parseInt(br.readLine())
                * Integer.parseInt(br.readLine());
        while(val!=0) {
            arr[val%10]++;
            val /= 10;
        }

        for(int result : arr) {
            System.out.println(result);
        }
    }
}

그래 이거지....! 

내가 바라던 게 바로 이거였다...ㅎ

 

단순히 Test Case를 통과하는 것 뿐만 아니라

메모리와 시간복잡도를 고려하면서 코딩을 해야해서..

코딩테스트는 단기간에 준비할 수는 없는 것 같다. 

앞으로 하루에 1시간씩 꾸준히 단계별로 풀어가봐야겠다.

 

ref : https://st-lab.tistory.com/45#comment13067545