문제: 세 개의 자연수 A, B, C가 주어질 때 A*B*C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.
(출처: https://www.acmicpc.net/problem/2577)
처음에 이 문제를 접했을 때는 곱한 수를 배열에 다 넣을 생각을 했다. 그리고 0부터 9까지 cnt를 만들어서 if문으로 만들어 일일이 대조할 생각을 했다. 막상 해 보니 cnt를 10개를 만들어야 하고 if문을 10개를 만들어야 하고 println을 10번을 써야했다. ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 아무리 생각해도 이건 방법이 아닌 것 같았다. 하물며 변수라도 포문을 돌릴 수 있으면 좋았을텐데 그럴 수도 없으니 무조건 이건 아니었다. 아마 될 지도 모르지 대신 코드와 메모리가 엄청나게 커지겠지!!!
그래서 포문으로 변수선언 하는 방법을 찾다가.. (ㅋㅋㅋㅋㅋㅋㅋ)이 문제를 접근하는 방법을 친구에게 들었다. 그런 무식한 방법을 떠나 숫자를 가지고 놀라는 거였다.
천재... 천재.... 천재천재 진심으로 존경하고 존경합니다.
예제에서처럼 A*B*C를 곱한 값이 17037300라고하면, 원래 나의 계획은 이 숫자만큼 배열을 만들어서 얘네를 집어넣는 거였으나, 배열을 0부터 9까지 10개를 만들어서 자리 값을 올려주는거다.
17037300을 10으로 나눈 나머지가 있을 때마다 그 나머지의 배열에 +1을 해주는 거!
17037300을 10으로 나눈 나머지는 0이다. 그럼 array[0]에 +1을 해준다.
D = D/10;
그런 뒤에 이 숫자를 10으로 나눠서 한 자리씩 줄여준다.
그럼 1703730이 되고 또 이 숫자를 10으로 나눈 나머지를 구해서 배열을 찾아 +1을 해준다.
몇자리가 나올지 모르니 while문을 돌리고 10으로 나눈 몫이 0이 됐을 때 while문에서 빠져나와 끝내고 출력을 해준다.
하앜....
기부니 좋구나!!!!! 적어도 30줄 나올 뻔한 코드가 이마이 줄어들 수가 있습니다. 천재 천재
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 | import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); int A = scan.nextInt(); int B = scan.nextInt(); int C = scan.nextInt(); boolean YN = true; int D = A*B*C; int [] array = new int [10]; while(YN) { int num = D%10; array[num] = array[num]+1; D = D/10; if(D == 0) { YN = false; } } for(int i=0 ; i<10 ; i++) { System.out.println(array[i]); } scan.close(); } } | cs |
'건승하고있어요 > 알고리즘' 카테고리의 다른 글
[for] 2007년 달력문제 (0) | 2018.02.08 |
---|---|
[소수] 소수찾기 (5) | 2018.02.07 |
[if] X보다 작은 수 (2) | 2018.02.07 |
[if] 평균구하기 (2) | 2018.02.06 |
[queue] 큐 기본문제와 상속 (8) | 2018.02.06 |