본문 바로가기
[백준]

[BaekJoon/백준] 6단계 "1차원 배열"

by Hevton 2020. 9. 2.
반응형

이에 해당하는 문제는 10818번, 2562번, 2577번, 3052번, 1546번, 8958번, 4344번으로 총 7문제이다.

여기서 내가 골머리를 썩힌 문제가 하나 있다. 바로 2577번. 왜 골머리를 썩혔냐고? 내가 멍청해서 그렇다. 이 글에서는 나의 멍청함을 알게 해준 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]);

	}
}

같은 문제인데 이렇게 엄청나게 다를 수가 있다는 게 너무 놀라웠다. 다시봐도 놀랍다. "나는 왜 이런 생각을 못했지" 라는 생각이 떠오르지도 않았다. 그냥 나는 이런 생각을 못 했을게 분명하다. 정말 기발한 방법이라고 생각이 들었다. 근데 대부분의 사람들이 이렇게 풀었더라.. 나만 그냥 사고능력이 없나보다. 앞으로 문제를 풀어도 다른 분들의 코드도 참고하면서 내 코드와 비교하고 공부하는 시간을 가져야겠다는 생각을 했다. 좋은 경험이었다. 이런 경험 덕분에 앞으로 더 잘 발전할 수 있는 기회가 주어진 것 같다며 스스로를 독려했다ㅎㅎ..

반응형

'[백준]' 카테고리의 다른 글

[BaekJoon/백준] 8단계 "문자열"  (0) 2020.09.05
[BaekJoon/백준] 7단계 "함수"  (0) 2020.09.04
[BaekJoon/백준] 5단계 "실습1"  (0) 2020.08.31
[BaekJoon/백준] 4단계 "while문"  (0) 2020.08.31
[BaekJoon/백준] 3단계 "for문"  (0) 2020.08.30