문제
세 개의 자연수 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까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.
예제입력 |
예제출력 |
150 266 427 |
3 1 0 2 0 0 0 2 0 0 |
문제풀이
가장 효율적인 방법이 무엇인지 생각하다 Map을 생각했다.
더 여러 방법이 있겠지만 우선 가장 첫번째로 생각난
Switch나 if로 분기점을 나누고 변수에 담아 반환하는 것은 변수를 다수 선언함으로써 비효율적이라 생각했다.
Map은 고유한 key 값을 가지기 때문에 따로 인덱스를 신경쓸 필요가 없고 해당 key의 value 값을 저장해 불러와서 확인 후 더해주기만 하면 끝이기 때문에 적합하다 생각한다.
문제점은 map을 잘 사용하지 않다보니 한번에 사용이 힘들어서 찾아보면서 풀었다.
채점현황을 확인했을때, 코드의 길이는 다소 길지만 메모리와 시간상 평균은 했다고 본다.
이것보다 빠르게 나온 사람은 어떤 알고리즘을 짰을지 궁금해진다.
import java.io.*;
import java.util.*;
class Main{
public static Map<Integer, Integer> countNumber(int sum){
Map<Integer, Integer> map = new HashMap<Integer,Integer>();
for(int i = 0; i < 10; i++){
map.put(i, 0);
}
while(sum != 0){
int key = sum % 10;
int value = map.get(key) + 1;
map.put(key, value);
sum /= 10;
}
return map;
}
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 sum = A * B * C;
Map<Integer, Integer> result = countNumber(sum);
result.forEach((key, value) -> {
System.out.println(value);
});
}
}
'Etc > problem solving' 카테고리의 다른 글
백준 1546, 평균 (0) | 2021.10.10 |
---|---|
백준 3052, 나머지 (0) | 2021.10.10 |
백준 2562, 최댓값 (0) | 2021.10.09 |
백준 10818, 최소, 최대 (0) | 2021.10.08 |
백준 1110, 더하기 사이클 (0) | 2021.10.08 |