이에 해당하는 문제는 10818번, 2562번, 2577번, 3052번, 1546번, 8958번, 4344번으로 총 7문제이다.
여기서 내가 골머리를 썩힌 문제가 하나 있다. 바로 2577번. 왜 골머리를 썩혔냐고? 내가 멍청해서 그렇다. 이 글에서는 나의 멍청함을 알게 해준 2577번에 대해서만 다뤄보겠다.
문제를 처음 봤을 때 부터 그냥 어려워 보였다. 내가 산수를 진짜 못해서 산수적인 프로그래밍은 더하기던 빼기던 곱셈이던 정말 뒤지게 못한다. 수리학적 사고방식이 부족하기 때문에 코드도 정갈하고 규칙있게 짤 수 없다 보니까 짜다 보면 스스로 꼬이다가 나락으로 가버린다.
이 문제가 정보올림피아드 초등부 2번문제란다. 진짜 내가 한참 모자르고 멍청하고 부족하고, 세상은 넓다는 것을 이 문제가 크게 깨우쳐줬다. 이 문제를 통해 나 자신의 모자람에 대해 크게 깨달았고, 현타의 시간도 굉장히 길게 가졌다. 초등부 2번 문제인데, 24살인 내가 코드를 쉽게 이어나가지 못하는 모습을 보니 스스로가 초라했고, 문제를 풀고 난 뒤에 다른 사람들의 간결한 풀이를 보고 한번 더 성찰의 시간을 얻게 되었다. 그럼 바로 내 풀이와 다른 사람들의 풀이를 보여드리겠습니다...
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main
{
public static void main(String args[])
{
int a, b, c, total, counter=0, index = 7;
int arr[], num[];
StringTokenizer tokenizer;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
try {
a = Integer.parseInt(br.readLine());
b = Integer.parseInt(br.readLine());
c = Integer.parseInt(br.readLine());
total = a*b*c;
for(int i = 10000000; i < total ; i=i*10)
index++;
counter = index-1;
arr = new int[index];
num = new int[10];
for(int z = (int)Math.pow(10, index-1); z >=1 ; z=z/10)
{
arr[counter] = total/z;
total = total%z;
counter--;
}
for(int i = 0; i < arr.length; i++)
{
switch (arr[i])
{
case 0:
num[0]++;
break;
case 1:
num[1]++;
break;
case 2:
num[2]++;
break;
case 3:
num[3]++;
break;
case 4:
num[4]++;
break;
case 5:
num[5]++;
break;
case 6:
num[6]++;
break;
case 7:
num[7]++;
break;
case 8:
num[8]++;
break;
case 9:
num[9]++;
break;
}
}
for(int i = 0 ; i < num.length ; i++)
{
bw.write(""+num[i]+"\n");
}
bw.flush();
br.close();
bw.close();
}catch (Exception e) {
}
}
}
한심한 내 풀이를 굳이 풀이해보자면, 세 개의 세 자리 숫자의 곱셈 값을 total에 저장한 뒤에 세자리 숫자의 곱셈은 100 100 100 인 최소 1000000부터 1000 1000 1000의 곱 미만까지 있으므로, 자릿수를 판독하기 위한 함수로 자릿수를 판독했고 이를 토대로 제일 큰 자릿수부터 나누고, 나머지연산을 시키면서 배열의 한 인덱스 안에 한 값씩 저장시켰다. 그리고 스위치 문으로 각 자릿수에 있는 값을 판독하며 0부터 9까지의 숫자가 몇번씩 쓰였는지 카운팅했다. 정말 쓸데없게 멍청한 과정들이 가득한 코드다. 문제를 풀면서, 내가 정보올림피아드 초등부에 나갔어도 바로 아무것도 못하고 탈락했을 것 같다는 생각이 들어서 현타가 크게 왔다.. 그리고 아래의 다른 사람의 풀이를 보고는 정말 앞으로 더 더 열심히 해야겠다는 생각을 했다..
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int A = sc.nextInt();
int B = sc.nextInt();
int C = sc.nextInt();
sc.close();
int D = A * B * C;
int[] arr = new int[10];
while(D > 0) {
arr[ D % 10 ]++;
D /= 10;
}
for(int i = 0; i < arr.length; i++)
System.out.println(arr[i]);
}
}
같은 문제인데 이렇게 엄청나게 다를 수가 있다는 게 너무 놀라웠다. 다시봐도 놀랍다. "나는 왜 이런 생각을 못했지" 라는 생각이 떠오르지도 않았다. 그냥 나는 이런 생각을 못 했을게 분명하다. 정말 기발한 방법이라고 생각이 들었다. 근데 대부분의 사람들이 이렇게 풀었더라.. 나만 그냥 사고능력이 없나보다. 앞으로 문제를 풀어도 다른 분들의 코드도 참고하면서 내 코드와 비교하고 공부하는 시간을 가져야겠다는 생각을 했다. 좋은 경험이었다. 이런 경험 덕분에 앞으로 더 잘 발전할 수 있는 기회가 주어진 것 같다며 스스로를 독려했다ㅎㅎ..