알고리즘 및 자료구조/백준(BackJoon)

백준 - 2577번

지팡구 2022. 8. 5. 03:22

https://www.acmicpc.net/problem/2577

 

2577번: 숫자의 개수

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.

www.acmicpc.net

 

설명 :

세 자연수 A, B, C의 곱을 계산한 후 결과값에 0~9가 몇 번씩 쓰였는지를 구하는 문제

 

내 생각 : 

우선 ABC를 입력받아야 하고, 입력받은 ABC를 곱한 값을 저장해야한다고 생각했다.

그래서 생각한 것이 "결과 값을 다시 문자열로 변환하고, 이 문자열을 한 문자씩 쪼개서 배열에다가 저장해야겠다"라고 생각했다.

 

코드를 작성하면서 왜이렇게 복잡해지고 불필요한 느낌이 들지? 라는 쎄한 생각이 들었다...

 

그렇게 한 문자씩 배열에 저장함과 동시에 다시 Int형으로 변환해주고 조건문을 이용해 각 자리를 count 하기 시작했는데, 이렇게 정리하면서 생각해보니까 굳이 이렇게 할 필요가 있나? 라는 생각이 들었다.

 

저장, 변환 과정을 거치지 않고 abc의 곱 값을 count 하면  될 것 같은 아이디어가 떠올랐다.

 

내가 코드를 이렇게 생각한 이유는 아마 직접 눈으로 확인해보고 싶어서이지 않을까 싶다.

 

내가 작성한 코드는 다음과 같다. 

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int [] swit = new int[9];
        int [] count = new int[10];
        String [] Arr = new String[9];
        int A = Integer.parseInt(br.readLine());
        int B = Integer.parseInt(br.readLine());
        int C = Integer.parseInt(br.readLine());
        int num = A*B*C;
        String st = Integer.toString(num);
        Arr=st.split("");
        for(int a=0; a<st.length(); a++){
           swit[a]= Integer.parseInt(Arr[a]);
        }
        while(num>0){
            count[num%10]++;
            num/=10;
        }
        for(int c=0; c<count.length; c++){
            System.out.println(count[c]);
        }
    }

 

위에서 설명했던 것처럼 코드를 작성했었고, 굳이 뭐 이렇게 할 필요가 없을거 같았다. 

 

위에 불필요한 배열의 선언과 변환 등의 과정을 지우고 다시 제출해서 런해보니 시간은 동일하나 메모리는 줄었다.

 

내가 생각한 방식에는 %연산자를 이용해 숫자를 10으로 나눈 나머지를 이용해 count를 해주는 방식을 생각했다. 

이러한 방법을 abc의 곱 값이 0보다 큰 동안 반복했다.

 

내가 생각한 방법 말고도 charAt을 이용한 방법으로 제출한 사람들도 있었다. 

 

결국 charAt을 이용하려면 문자를 숫자로 변환해주는 과정이 필요하다

 

https://cokes.tistory.com/80

 

자바 charAt(int i) -'0' 에 대해서 문자를 정수형으로?

charAt은 자바에 문자열에 index값을 통해 문자를 읽어오는 방법으로 String str = "코크입니다"; 라는 문자열이 있으면, str.charAt(0); // 코 str.charAt(1); // 크 str.charAt(2); // 입 str.charAt(3); // 니..

cokes.tistory.com

 

핵심 코드이다

 

설명과 같이 코드를 작성해서 채점을 해본 결과 4ms가 단축되었다..

        String num = Integer.toString(A * B * C);

        for (int i = 0; i < 10; i++) {
            int count = 0;
            for (int j = 0; j < num.length(); j++) {
                if ((num.charAt(j) - '0') == i) {
                    count++;
                }
            }
            System.out.println(count);
        }

 

'알고리즘 및 자료구조 > 백준(BackJoon)' 카테고리의 다른 글

백준 - 3052번  (0) 2022.08.08
백준 - 1546번  (0) 2022.08.07
백준 -2562번  (0) 2022.08.05
백준 - 10818번  (0) 2022.08.05
백준 2588번 - 곱셈 (Scanner와 BufferedReader)  (0) 2022.07.27