[BaekJoon/백준] 1193번

Hevton·2020년 9월 9일
0
post-custom-banner

내가 수학을 못한다는 결정적인 증거로, 나는 수학 관련 코딩 문제에 따라 풀이 시간과 노력, 그리고 성과도 매우 들쑥날쑥하다.
이번 1193번은 왠지모르게 너무 어려웠다. 나는 이런 '공식을 찾고 코딩화' 하는 부류의 수학 관련 문제들을 풀 때마다 애를 먹는다.

원래같으면 지저분하게라도 코딩하겠지만, 최대한 지저분하지 않고 일관성있고 체계적인 코드 흐름으로 구성해보려 하다 보니까, 내 머리가 과부하가 걸리게 되고, 그러다 보니 문제를 푸는 시간이 질질 끌리게 된다.

해당 문제는 처음 볼때는 되게 쉬워보였는데, 역시나 내 머리를 너무 과대평가 하고 있었다. 어떻게 하면 최대한 잘 코드를 짤 수 있을까 생각하면서, 그리고 간단한 규칙이 분명히 있을거라는 생각속에서 코딩을 했는데 결국 결과는 지저분한 코드들의 집합이 되었다.

  1. 지저분한 코드
import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        int x = 1, y = 1, counter = 1;

        while (true) {
            if (counter * (counter + 1) / 2 >= N) {
                if (counter % 2 == 0) {
                    x = 1;
                    y = counter;
                    for (int i = 1; i < counter + 1; i++) {
                        if (counter * (counter - 1) / 2 + i == N) {
                            System.out.println("" + x + "/" + y);
                            return;
                        } else {
                            x++;
                            y--;
                        }
                    }
                } else {
                    x = counter;
                    y = 1;
                    for (int i = 1; i < counter + 1; i++) {
                        if (counter * (counter - 1) / 2 + i == N) {
                            System.out.println("" + x + "/" + y);
                            return;
                        } else {
                            x--;
                            y++;
                        }
                    }
                }
            }
            counter++;
        }
    }
}

언뜻 봐도 나의 엄청난 고민의 흔적이 보일 정도로 코드 자체도 복잡하게 생겼고, 읽다 보면 어지러워서 토가 나올 지경이다..
어찌저찌 결과는 맞았지만 해당 문제의 규칙에 대해 간결화를 시키지 못한 탓에, 코드 또한 간결하지가 못한 상태다.

정답을 맞춘 후 다른 분들의 코드를 보면서, 많은 것을 배웠다. 솔직히 요즘 느끼는건데, 내가 '문제를 어떻게던간에 풀었다 '라는 결과는 중요치가 않은 것 같다. 그보다 중요한 건 내가 문제를 풀어 보고 나서 다른 사람들의 풀이도 읽어보고, 나의 코드와 비교하면서 배울 점에 대해 공부해나가는 과정이 이런 코딩문제를 푸는 데에 가장 중요한 과정이라고 생각이 든다.

사람들은 되게 간결하게 풀기도 했다. 정말 내 풀이가 고전적이라면, 다른 사람들의 풀이는 신형이랄까.. '문제 해석의 간결화'와 '문제를 곧이곧대로 해석하여 풀기 전에, 방법에 대한 생각의 전환의 시간을 갖는 것'이 나에게 가장 중요한 과제라고 할 수 있을 것 같다.

나는 다른 분들의 코드들을 참고하면서, 다시 간결하게 구성해 보았다.

  1. 간결하게 구성해본 코드
import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        int x = 1, y = 1, c = 1, t=0;

        // N번째를 포함하고 있는 대각선 줄 c
        while(!(c*(c+1)/2>=N))
            c++;

        int gap = N - (c*(c-1)/2+1); // 시작점과의 차이 (줄 c의 시작점에서부터 몇번 가야 하나)
        x = c-gap; y = 1+gap;
        if(c%2==0)
            System.out.print(""+y+"/"+x);
        else
            System.out.print(""+x+"/"+y);
    }
}

이처럼 간결하게 다시 코드를 구성해보면서 많은 성찰과 공부를 할 수 있었다.
어쩌면, 문제를 어렵게 생각하려다 보니 더욱 어려워 지는 것 같다는 생각도 든다..

profile
놀만큼 놀았다.
post-custom-banner

0개의 댓글