티스토리 뷰

링크

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

 

2577번: 숫자의 개수

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

www.acmicpc.net

 

문제

세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.

예를 들어 A = 150, B = 266, C = 427이라면이라면 A × B × C = 150 × 266 × 427 = 17037300 이 되고, 계산한 결과 17037300 에는 0 3, 1 1, 3 2, 7 2번 쓰였다.

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

출력
첫째 줄에는 A × B × C의 결과에 0 이 몇 번 쓰였는지 출력한다. 마찬가지로 둘째 줄부터 열 번째 줄까지 A × B × C의 결과에 1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.

 

접근 방법

계산된 숫자의 사용 횟수를 전부 출력하는 것이 목표이다. 문제에서 요구하는 계산은 간단하다. 

  • 계산된 숫자 = A * B * C

자, 그러면 숫자의 사용 횟수는 어떻게 가져와야 할까? 나는 고정 배열을 사용했다. 0~9까지의 모든 사용 숫자를 확인해야 하므로 각 숫자의 사용 횟수를 저장하는 10칸의 고정 배열을 만들었다. 

이제 각 자리 숫자를 세기만 하면 된다. 어떻게 셀 것인가? 몫과 나머지를 이용하면 쉽게 해결된다.

while 반복문을 통해 숫자가 0보다 높을 때만, 반복할 수 있게 조건을 두고, 다음과 같은 로직을 반복한다.

  1. 나머지를 통해 가장 오른쪽 숫자를 구한다.
  2. 나눗셈을 통해 몫만을 다시 저장한다. 이렇게 되면 가장 오른쪽 숫자는 빠지게 된다.

코드

프로그래머스 형식과 같이 메서드로 분리해서 쓰는 것이 습관이 되다 보니, 백준에 제출할 때 항상 클래스 명을 바꿔줘야 하는 불편함이 있다. 또한 main에서 한 번에 처리할만한 문제도 클래스 생성자와 solution 메서드를 통해 분리해서 쓰다 보니, 가독성에 불편함을 느낄 수 있는 사람도 있으니, 오늘부터 2가지 코드를 제공하겠다.

 

백준화 한 코드

import java.util.Scanner;

public class Main{

    public static void main(String[] args) {
        int[] answer = new int[10] ;
        int[] data = new int[3];
        int num = 1 ;
        Scanner sc = new Scanner(System.in);

        // 입력
        for (int i = 0 ; i < data.length ; i++){
            data[i] = sc.nextInt();
        }

       // A,B,C 의 곱
        for (int i : data){
            num *= i;
        }

        //가장 오른쪽 숫자부터 사용 숫자 카운트
        while (num >0){
            answer[num%10] +=1;
            num = Math.floorDiv(num,10);
        }


        //output
        for (int i = 0 ; i < answer.length ; i++){
            System.out.println(answer[i]);
        }

    }

}

기존 방식

더보기
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Main test = new Main();
    }

    public Main () {
        int[] answer ;
        int[] data = new int[3];
        Scanner sc = new Scanner(System.in);

        for (int i = 0 ; i < data.length ; i++){
            data[i] = sc.nextInt();
        }

        answer = solution(data);

        for (int i = 0 ; i < answer.length ; i++){
            System.out.println(answer[i]);
        }
    }

    public int[] solution(int[] data){

        int num = 1 ;
        int[] answer = new int[10];
        
        for (int i : data){
            num *= i;
        }
        
        while (num >0){
            answer[num%10] +=1;
            num = Math.floorDiv(num,10);
        }


        return answer;
    }

}

 

결과

'공부 > 코딩 테스트 준비' 카테고리의 다른 글

[백준] 2739 - 구구단 JAVA  (0) 2021.08.16
[백준] 2675 - 문자열 반복 JAVA  (0) 2021.08.16
[백준]2562 - 최대값 JAVA  (0) 2021.08.14
[백준] 2439 - 별 찍기 2 JAVA  (0) 2021.08.12
[백준] 1546 - 평균 JAVA  (0) 2021.08.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함