본문 바로가기
공부/java

자바(java) 문제 풀이 복습

by 샤샤샤샤 2022. 11. 25.

오늘은 내가 풀다가 어려웠거나 참신하다고 느낀 문제들 리뷰를 하겠다.

출처는 우리 강사님 블로그다.

https://blog.naver.com/nissisoft21/222520498886

 

자바 100제 문제1~50

안녕하세요 코딩강사입니다. 앞으로 자바 100제 문제풀이를 통해, 그동안 배운 자바문법을 공부하고 학습하...

blog.naver.com

 

 

문제 43 숫자를 한글로 바꾸기(난이도 중)

문제 설명
엑셀에서 숫자를 입력하면 그 숫자에 맞는 한글로 변환해주는 NUMBERSTRING 함수가 있다.


위 그림과 같이 A1셀에 12345를 입력하면 A2셀의 결과처럼 보여준다.
이 함수를 java언어로 직접 만들어보자.

 

입력
양의 정수 n이 입력된다. ( 0 <= n <= 99999) 만의 자릿수까지만 입력됨.

출력
정수 n을 한글로 출력한다.

 

입력 예시
12345

출력 예시
일만이천삼백사십오

도움말
엑셀 수업하다가 만든 문제입니다.(처음 설계가 잘못되면 복잡하게 코드가 전개될 가능성이 높습니다.)
정답은 엑셀의 NUMBERSTRING 함수에 근거합니다.

몇 가지 예를 더 들어보여드립니다.

500300  ==> 오십만삼백
1  ==> 일
15 ==> 일십오

 

 

내가 풀은 풀이

mport java.util.Scanner;

public class ex43 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int num = scan.nextInt();
            int a = num / 10000;  //만의 자리
            int b = num % 10000 / 1000;  // 천의 자리
            int c = num % 1000 / 100;  // 백의자리
            int d = num % 100 / 10;  // 십의 자리
            int e = num % 10;  // 일의 자리
            if (a>0) {
                switch (a) {
                    case 1:
                        System.out.print("일");
                        break;
                    case 2:
                        System.out.print("이");
                        break;
                    case 3:
                        System.out.print("삼");
                        break;
                    case 4:
                        System.out.print("사");
                        break;
                    case 5:
                        System.out.print("오");
                        break;
                    case 6:
                        System.out.print("육");
                        break;
                    case 7:
                        System.out.print("칠");
                        break;
                    case 8:
                        System.out.print("팔");
                        break;
                    case 9:
                        System.out.print("구");
                        break;
                }
                System.out.print("만");
            }
            if (b>0) {
                switch (b) {
                    case 1:
                        System.out.print("일");
                        break;
                    case 2:
                        System.out.print("이");
                        break;
                    case 3:
                        System.out.print("삼");
                        break;
                    case 4:
                        System.out.print("사");
                        break;
                    case 5:
                        System.out.print("오");
                        break;
                    case 6:
                        System.out.print("육");
                        break;
                    case 7:
                        System.out.print("칠");
                        break;
                    case 8:
                        System.out.print("팔");
                        break;
                    case 9:
                        System.out.print("구");
                        break;
                }
                System.out.print("천");
            }
            if (c>0) {
                switch (c) {
                    case 1:
                        System.out.print("일");
                        break;
                    case 2:
                        System.out.print("이");
                        break;
                    case 3:
                        System.out.print("삼");
                        break;
                    case 4:
                        System.out.print("사");
                        break;
                    case 5:
                        System.out.print("오");
                        break;
                    case 6:
                        System.out.print("육");
                        break;
                    case 7:
                        System.out.print("칠");
                        break;
                    case 8:
                        System.out.print("팔");
                        break;
                    case 9:
                        System.out.print("구");
                        break;
                }
                System.out.print("백");
            }
            if (d>0) {
                switch (d) {
                    case 1:
                        System.out.print("일");
                        break;
                    case 2:
                        System.out.print("이");
                        break;
                    case 3:
                        System.out.print("삼");
                        break;
                    case 4:
                        System.out.print("사");
                        break;
                    case 5:
                        System.out.print("오");
                        break;
                    case 6:
                        System.out.print("육");
                        break;
                    case 7:
                        System.out.print("칠");
                        break;
                    case 8:
                        System.out.print("팔");
                        break;
                    case 9:
                        System.out.print("구");
                        break;
                }
                System.out.print("십");
            }
            if (e>0) {
                switch (e) {
                    case 1:
                        System.out.print("일");
                        break;
                    case 2:
                        System.out.print("이");
                        break;
                    case 3:
                        System.out.print("삼");
                        break;
                    case 4:
                        System.out.print("사");
                        break;
                    case 5:
                        System.out.print("오");
                        break;
                    case 6:
                        System.out.print("육");
                        break;
                    case 7:
                        System.out.print("칠");
                        break;
                    case 8:
                        System.out.print("팔");
                        break;
                    case 9:
                        System.out.print("구");
                        break;
                }
                System.out.println("");
            }
        }
    }

 

이제 다시 보니 너무 무식하게 때려밖았다는 생각이 든다. 복사, 붙여넣기로 풀어서 일일이 타자를 칠 필요는 없었지만 코드가 쓸데없이 너무 길다. 다시 좀더 간소화해보자

 

import java.util.Scanner;

public class ex43 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int num = scan.nextInt();
        int a = num / 10000;  //만의 자리
        int b = num / 1000 % 10;  // 천의 자리
        int c = num / 100 % 10;  // 백의자리           나중에 나누면 0을 나눌수도
        int d = num / 10 % 10;  // 십의 자리           있이서 순서를 바꿈
        int e = num % 10;  // 일의 자리
        int numbers[] = {a, b, c, d, e};       // 각 자리수를 배열로 만듬
        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i] > 0) {              // 해당 자리수가 0 이상인지 판별식
                switch (numbers[i]) {
                    case 1:
                        System.out.print("일");
                        break;
                    case 2:
                        System.out.print("이");
                        break;
                    case 3:
                        System.out.print("삼");
                        break;
                    case 4:
                        System.out.print("사");
                        break;
                    case 5:
                        System.out.print("오");
                        break;
                    case 6:
                        System.out.print("육");
                        break;
                    case 7:
                        System.out.print("칠");
                        break;
                    case 8:
                        System.out.print("팔");
                        break;
                    case 9:
                        System.out.print("구");
                        break;
                }
                if (i == 0) {
                    System.out.print("만");
                } else if (i == 1) {
                    System.out.print("천");
                } else if (i == 2) {
                    System.out.print("백");
                } else if (i == 3) {
                    System.out.print("십");
                } else {
                    System.out.println();
                }
            }
        }
    }
}

for문을 이용해 간소화 시켰고, 이를 위해 배열을 사용했다.

아마 이때는 배열을 배우지 않았을 때여서 저리 길게 썼었던 것 같다.

 

제 59( 난이도 중급 )

주희는 로또 매니아다.
매주 로또 한장을 사고 토요일이면 대박을 기대하면서 당첨번호를 확인한다.
몇 주 전 주희는 로또 결과가 4등이었는데 확인을 잘못해서 5등인줄 알고 그냥 바꾸기 귀찮아서 버렸었다.
이러한 사태가 다시는 일어나지 않게 하기 위해 우리가 프로그램을 만들어 주자.

(로또 순위 매기는 방법)

등수

방법

1등
당첨번호 6개 일치

2등
당첨번호 5개 일치 + 보너스번호 일치

3등
5개 번호 일치

4등
4개 번호 일치

5등
3개 번호 일치

꽝

2개 이하 일치
예)

13 23 24 35 40 45 7     ===> 로또 당첨번호 + 보너스 번호
 2  6  7 23  40 44      ====> 주희가 가진 로또 번호

따라서 주희는 "꽝"
힌트: 당첨번호가 5개 같은 경우, 보너스 번호를 주희 번호와 다시 비교해서 있으면, 2등, 없으면 3등임

 

입력
첫 줄에 로또 당첨번호 6개와 보너스 번호 1개가 주어진다.
둘째 줄에 주희가 가지고 있는 로또 번호 6개가 주어진다.

출력
주희의 당첨 결과를 출력한다.

 

출력방법) 
1등 = 1 출력, 2등 = 2 출력, 3등 = 3 출력, 4등 = 4 출력, 5등 = 5 출력, 꽝 = 0 출력

 
입력 예시 (자유롭게 입력받으세요.)
13
23
24
35
40
45
 7

 

2
6
7
23
40
44

출력 예시
0 꽝!

 

나의 풀이

import java.util.Scanner;

public class ex59 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int a[] = new int[6];         // 당첨번호
        int b[] = new int[6];         // 주희의 번호
        a[0] = scan.nextInt();
        a[1] = scan.nextInt();
        a[2] = scan.nextInt();
        a[3] = scan.nextInt();
        a[4] = scan.nextInt();
        a[5] = scan.nextInt();
        int bonusNum = scan.nextInt();  // 보너스 번호
        String lotteryNum =  "" + a[0] + a[1]+ a[2]+ a[3]+ a[4]+ a[5];
        System.out.println("로또번호 : " +lotteryNum + "+" + bonusNum);
        b[0] = scan.nextInt();
        b[1] = scan.nextInt();
        b[2] = scan.nextInt();
        b[3] = scan.nextInt();
        b[4] = scan.nextInt();
        b[5] = scan.nextInt();
        String correctNum = "" + b[0] + b[1]+ b[2]+ b[3]+ b[4]+ b[5];
        System.out.println("주희 번호 : " + correctNum);
        int sum =0;
        for (int i=0; i <=5; i++){    // 당첨 번호와 같은 번호가 몇개인지 센다
            for (int j=0; j<=5; j++){
                if (a[i]==b[j]){
                    sum++;
                }
            }
        }
        switch (sum){               // 당첨 번호와 주희의 번호가 같은 경우의 수
            case 0 :
                System.out.println("꽝");
                break;
            case 1 :
                System.out.println("꽝");
                break;
            case 2 :
                System.out.println("꽝");
                break;
            case 3 :
                System.out.println("5등");
                break;
            case 4 :
                System.out.println("4등");
                break;
            case 5:                 // 5개가 같을 시, 2등과 3등을 구분해줘야 한다
                int bonus= 0;
                for (int i=0; i<=5; i++){     // 보너스 번호를 맞출시 bonus+1
                    if (bonusNum == b[i]) {
                    bonus++;
                    }
                }
                if (bonus==0){
                    System.out.println("3등");
                }
                if (bonus==1){
                    System.out.println("2등");
                }
                break;
            case 6 :
                System.out.println("1등");
                break;
        }
    }
}

이 문제는 딱히 수정해야할건 없다고 본다.  굳이 수정하자면 a[]와 b[]의 배열 선언을 반복문을 통해 좀더 깔끔하게 하는게 전부.

 

문제 60

어떤 차의 높이가 170cm 이다.
이 차는 3개의 터널 a, b, c를 차례대로 지나게 될 것이다.
각 터널의 높이가 차의 높이(170)보다 같거나 낮으면 차는 터널과 충돌하여 사고가 날 것이다.
각 터널 a, b, c의 높이가 차례대로 3개 입력되면,
터널을 무사히 잘 통과하면 PASS 를 출력하고, 사고가 난다면 CRASH 와 처음 충돌하는 터널의 높이를 출력하시오.\

 

입력
터널 a,b,c의 높이가 차례대로 3개 입력된다. (정수)

출력
높이가 170인 차가 잘 통과할 수 있으면 PASS를 출력, 170보다 같거나 작으면 CRASH 처음 충돌한 터널 높이를 출력하시오. 도움말을 참고하세요.

 

입력 예시 
171
168
165

출력 예시
CRASH 168

 

나의 풀이

import java.util.Scanner;

public class ex60 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int a = scan.nextInt();
        int b = scan.nextInt();
        int c = scan.nextInt();
        if (a > 170) {
            if (b < 170) {
                System.out.println("작살");
                System.out.println(b);
            }
            if (b > 170) {
                if (c < 170) {
                    System.out.println("작살");
                    System.out.println(c);
                }
            }
        } else {
            System.out.println("작살");
            System.out.println(a);
        }
        scan.close();
    }
}

이것 역시 abc를 배열안으로 넣어서 반복문을 돌리면 깔끔하게 코드를 짤 수 있다.

import java.util.Scanner;

public class ex60 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int height[] = new int[3];
        for (int i = 0; i < 3; i++) {
            if (height[i] > 170) {
                System.out.println("통과");
            } else {
                System.out.println("작살");
                System.out.println(height[i]);
            }
            scan.close();
        }
    }
}
문제 61

영민이는 프로그램을 이용하여 계산기를 만들려고 한다.
하지만 영민이는 프로그램을 얼마 배우지 않아 어려워하고있다.
우리가 영민이를 위해 계산기 프로그램을 만들어주자.

입력
연산식이 한줄로 입력된다.
연산식의 형식은 정수+정수 또는 정수-정수 또는 정수*정수 또는 정수/정수의 형태이다.

 

출력
계산 결과를 정수로 출력한다.
나눗셈일 경우 실수로 출력하되 소수 둘째자리까지 출력한다.
(0으로 나누는 경우는 입력되지 않는다.)

 

입력 예시 
10  (정수로 입력받음)
+   (문자로 입력받음)
10  (정수로 입력받음)

출력 예시
20

나의 풀이

import java.util.Scanner;

public class ex61 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int a = scan.nextInt();
        String b = scan.next();
        int c = scan.nextInt();
        
     if (b.charAt(0) == '+'){
            System.out.println(a+c);
        }
        if (b.charAt(0) == '*'){
            System.out.println(a*c);
        }
        if (b.charAt(0) == '-'){
            System.out.println(a-c);
        }
        if (b.charAt(0) == '/'){
            double divide = (double) a/c;
            System.out.println((int)(divide*100)/100f);
        }


    }
}

charAt() 함수를 이용해서 문자열을 추출해서 비교했다.

그러나 문자열 비교가 가능한 switch문을 이용하면 더 직관적으로 짤 수 있다.

import java.util.Scanner;

public class ex61 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int a = scan.nextInt();
        String b = scan.next();
        int c = scan.nextInt();
        switch (b){                    // 문자열 비교 가능
            case "+":
                System.out.println(a+c);
                break;
            case "-":
                System.out.println(a-c);
                break;
            case "*":
                System.out.println(a*c);
                break;
            case "/":
                System.out.println((float)a/c);
                break;
        }

 

문제 78

계산기 1에서 두 피연산자에 대한 연산만 다루었다.
이번에는 식을 입력하면 차례대로 계산하여 출력하는 계산기를 만들어보자.
단, 우선순위는 따지지 않고 왼쪽에서 부터 차례대로 계산하고, 모든 계산은 정수형 계산으로 처리한다.

입력
첫째 줄에 정수와 사칙연산기호가 식으로 입력된다.
(정수는 int 범위, 괄호 없이 +,-,*,/) 
식의 마지막엔 =가 입력된다.

출력
왼쪽부터 차례대로 연산한 결과를 출력한다.(연산자 우선순위 없음)

입력 예시 
3
+
3
–
3
*
3
/
3
=

출력 예시
3

나의 풀이

import java.util.Scanner;

public class ex78 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int a = scan.nextInt();         // 먼저 첫번째 수를 입력 받음
        String c;
        int result = a;
        for(;;){
            c = scan.next();           // 연산기호 입력 받음
            char d = c.charAt(0);
            if (d =='=') {             // 연산기호가 =이면 for문 탈출
                break;
            }
             a = scan.nextInt();            // 두번째 수를 입력 받음
            if (d =='+'){
                result = result+a;
            }else if(d=='-'){
                result = result-a;

            }else if (d =='*'){
                result = result*a;
            }else if (d =='/'){
                result = result/a;
            }
        }
        System.out.println(result);
    }
}

굳이 바꾸자면 for(;;)을 while(true)로 바꾸는 정도.

이 문제는 상당히 고전했다.

for문 안에서 두번수를 연산기호보다 먼저 입력받도록 코드를 짜서,  논리적으로 결함이 없는데 어디가 문제인지 머리를 싸맸다. 코드가 순차적으로 진행된다는 것을 고려하지 못한 실수였다.

 

문제 80

암호학에서 씨저 암호(Caesar cipher)는 가장 오래된 암호이고 가장 대표적인 대치(substitution) 암호로서
평문 문자를 다른 문자로 일대일 대응시켜 암호문을 만들어 내는 방식이다.

씨저 암호는 알파벳을 3글자씩 밀려서 쓰면서 문장을 만들었다.
실제 씨저는 부하인 브루투스에게 암살되기 전에 키케로에게 다음과 같은 암호문을 보냈다고 한다.

qhyhu wuxvw euxwxv
===> never trust brutus    (절대 부루투스를 믿지마라)

원리는 간단하다. 3작은 알파벳으로 치환하면 된다.

암호 - A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
평문 - X Y Z A B C D E F G H I J K L M N O P Q R S T U V W 

씨저의 암호문이 주어지면 평문으로 복원하는 프로그램을 작성하시오.

입력
공백이 있는 영어 문자열이 주어진다.(최대 200글자)

출력
평문으로 복원하시오.

입력 예시 
qhyhu wuxvw euxwxv

출력 예시
never trust brutus

나의 풀이

import java.util.Scanner;

public class ex80 {
    public static void main(String[] args) {
//        암호 - A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
//        평문 - X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
        Scanner scan = new Scanner(System.in);
        String cipher[] = {"x", "y", "z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
                "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w"};
        char [] english = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
                'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};

        String scanStr = scan.nextLine();
        String splitStr[] = scanStr.split(" ");  // 띄어쓰기를 기준으로 글자를 배열화 시킴     
        for (int i=0; i < splitStr.length; i++) {
            char letterArray[] = new char [ splitStr[i].length() ];  //letterArray생성
            for (int j=0; j< splitStr[i].length(); j++){
                letterArray[j] = splitStr[i].charAt(j);  // 단어별로 배열화시킨 문자를 다시 추출해서
                for (int k=0; k < cipher.length; k++){   // letterArray 배열로 넣음. 문자로 분리
                   if (letterArray[j] == cipher[k].charAt(0)){  
                       if (k==0){
                           System.out.print(cipher[23]);
                       } else if (k==1){
                           System.out.print(english[24]);
                       }else if (k==2){
                           System.out.print(english[25]);
                       } else {System.out.print(cipher[k-3]);
                       }
                   }
                }
            }
            System.out.print(" ");
        }
    }
}

아스키 코드를 이용해서 풀려하다가 실패했었다.

실패 원인은 알파벳이 아닌, 숫자로 표현하려고 했던 것이다.

즉 c보다 세칸 뒤에 있는 알파벳이라면 c-3 과 같이 표현해야 하는데 나는 'c'-3 또는 (char)(99-3) 과 같이 표현하려고 했다. 자꾸만 오류가 발생해서 결국 그냥 포기하고 전부 배열에 때려밖았다.

 

문제 95

어떤 영어 문장이 주어지면 각 알파벳이 몇 번 나왔는지 출력하시오.

입력
영어 한 문장이 입력된다. (90글자 이내) 
이 문장은 영어 소문자와 공백, 특수문자로 이루어져있다.

출력
각 알파벳의 개수만 출력한다. 그외 특수문자나 공백의 개수는 출력하지 않는다.

입력 예시 
oh! my god!

출력 예시
a:0
b:0
c:0
d:1
e:0
f:0
g:1
h:1
i:0
j:0
k:0
l:0
m:1
n:0
o:2
p:0
q:0
r:0
s:0
t:0
u:0
v:0
w:0
x:0
y:1
z:0
import java.util.Scanner;

public class ex95 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();
        String [] array = str.split("");        // 이게 되네( 모든 문자를 하나씩 나누기)
        char alphabet [] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
                'r','s','t','u','v','w','x','i','z'};
        int count [] = new int[26];
        for (int i=0; i<str.length(); i++){                
                if (alphabet[j] == array[i].charAt(0)) {
                    count[j]++;
                }
            }
        }
        for(int i=0; i<alphabet.length; i++){
            System.out.println(alphabet[i] +" : " +count[i]);
        }
    }
}

위의 문제와 같은 이유로 아스키코드로 못풀었다.

또한 charAt()함수를 사용하기 위해서 alphabet배열의 형식을 char로 지정했다는게 특이할 점이긴 하다.

 

문제 96

민준이는 뒤늦게 정보 과목의 중요성을 깨닫고 학습실에서 공부를 하고 있다.
기본 공부가 너무 안 되어 있어 아주 쉬운 문제부터 어려움을 겪은 민준이는 친구에게 물어보려고 한다.
가장 잘 하는 친구에게 물어보기는 질문의 내용이 너무 부끄러워 n명의 친구들 중 정보 성적이 3번째로
높은 친구에게 묻고자 한다.

친구들의 성적은 모두 다르다.
n명의 친구들의 이름과 정보 성적이 주어졌을 때 성적이 세 번째로 높은 학생의 이름을 출력하시오.

입력
첫째 줄에 n이 입력된다. ( 3 <= n <= 50 )
둘째 줄 부터 n+1행까지 친구의 이름과 점수가 차례대로 입력된다. 이름은 영문

출력
세 번째로 높은 학생의 이름을 출력한다.

입력 예시 
5
minsu
78
gunho
64
sumin
84
jiwon

96
woosung
55

출력 예시
minsu

도움말
문자열인 String과 정수를 나타내는 int를 서로 바꿔야할 때가 있습니다.
아래 코드는 서로 유형을 바꿔주는 코드입니다.



String -> int

 

      int numInt = Integer.parseInt(numStr);
        System.out.println(numInt);




Int -> String



     String numStr2 = String.valueOf(numInt);
        System.out.println(numStr2);
import java.util.Scanner;

public class ex96 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n =scan.nextInt();
        String grade [][] = new String[n][2];   // 이름, 성적으로 구분되는 이차배열 grade
        for (int i=0; i<n; i++){
            String name = scan.next();
            int individual = scan.nextInt();
            grade[i][0]= name;
            grade[i][1]= Integer.toString(individual); //{{이름1, 점수1}
        }                                              // {이름2, 정수2}...}  형식의 2차 배열
        int nums[] = new int[n];
        for (int i=0; i<n; i++){                       // grade의 점수부분만 따로 배열로 만듬
            nums[i]=Integer.parseInt(grade[i][1]);
        }
        for (int i =0; i< nums.length; i++){
            for (int j= i+1; j<nums.length; j++){       //버블정렬을 이용한 내림차순 정렬
                if (nums[i]<nums[j]){
                    int temp =nums[i];
                    nums[i]=nums[j];
                    nums[j]=temp;
                }
            }
        }
        for(int i=0; i<nums.length; i++)
            if (Integer.parseInt(grade[i][1]) == nums[2]){
                System.out.println(grade[i][0]);
            }
        }
    }

이차 배열이 머리속에서 살짝 헷갈려서 고생했다. 이차배열의 뒷[ ] 는 행(가로), 앞 [ ]는 열(세로). 확실하게 기억하자.

 

 

이번에 선생님이 내준 문제를 다 풀고 프로그래머스 문제를 풀어봤는데 다소 충격받았다.

내가 잘 모르는 내장함수야 중요한거 몇개 외우고 필요할 때마다 검색하면 된다지만, 알고리즘을 전혀 모르니까 코드를 맞게 짜도 작동 시간이 느려 테스트 통과를 실패했다.

겨우 1레벨이었는데 말이다.

 

이제 막 기초를 땐 내가 알고리즘까지 공부해야 하나 싶은 생각이 든 것도 사실이다. 하지만 나는 이미 파이썬에서도 비슷한 문제를 맞닥뜨렸을 때도 같은 이유를 대며 공부하지 않았었다. 그때는 그 행동이 맞았다고 생각한다. 만약 그때 알고리즘을 파고 들었으면 코딩에 흥미를 잃었을 수도 있다. 그러나 지금은 아니다. 단지 취업이 아닌, 10년, 20년 뒤의 내 커리어와 모습을 상상해보면 답은 명확하다. 대졸 5년차보다 못난 10년차가 아닌, 15년차보다 나은 10년차가 되고 싶으면 알고리즘을 공부해야만 한다.

 

내가 이쪽으로 진로를 택한 가장 큰 이유는 적성에 맞아서이긴 하지만, 실력이 전부라는 것 역시 적성만큼이나 큰 비중을 차지했다. 객관적으로 나는 남들에 비해 스펙이 부족하다. 투자한 시간도 적고 노력도 안했으니 당연하다. 그 간극을 매꾸기 위해서는 실력이 더 뛰어나야만 한다. 알고리즘 공부 안해도 프로그램은 잘 돌아간다지만 좋은 코드는 되지 못한다.