디늑
335
2019-08-20 16:09:03
7
1596

문제 해결 능력


개발자에게 가장 중요한건 문제 해결 능력입니다.

대부분 명확하게 문제 해결 능력인 뭔지에 대해 설명하는게 없고 두루뭉실하게 이야기들을 합니다.

문제 해결 능력이란 걸 이해하기 위해

이해라는 개념을 좀더 상세하게 생각할 필요가 있습니다.

이해는 깊은이해와 얇은이해가 있습니다.

예로 바다라는 것에 대해 해변에서 보는 바다, 수평선만 보이는 바다, 바다속에서 잠수해서 보는 바다는 각기 다르죠

한가지만 아는 사람과 여러개를 아는 사람하고 같은 수준으로 이해하고 있다고 말 할 수 없겠죠

여기서 중요한건 관점입니다.

여러 관점에서 바다를 이해하고 있죠


설계는 분석을 기반으로 나오기때문에 분석이 제대로 안되기때문에 설계가 진행이 안됩니다.

예시로 위 내용으로 문제하나를 풀어보겠습니다.

문제는 밑에와 같이 출력하는 2차원 달팽이입니다.



이걸 보면 바로 문제를 이해했다고 착각하고 바로 설계로 가서 고민하게 됩니다.


문제를 보고 제대로 이해할려면 분석을 해야됩니다.

그럼 무엇을 분석해야 될까요?

바로 패턴을 추출해야 됩니다.

저 문제를 분석해보면 총 3가지 패턴을 추출할 수 있습니다.


1번 수가 1씩 증가한다.

2번 배열에 숫자를 찍어줄때 반복 횟수가 5 -> 4 -> 4 -> 3 -> 3 -> 2 -> 2-> 1 -> 1 로 진행되는 패턴을 찾을 수 있습니다.


3번 배열의 인덱스 패턴을 찾을 수 있습니다.

저 패턴을 한번더 압축할 수 있는데요 바로 너비와 높이가 증가할때와 감소할때로 묶을 수 있습니다.


여기까지 진행되야 비로소 제대로 문제를 이해한겁니다. 그리고 알고리즘이나 코딩은 결국 위와 같이 패턴을 찾게 됩니다.

알고리즘은 결국 문제를 분석(이해)하고 숨은 패턴찾기라고 봐도 무방합니다.


그리고 분석한 패턴을 기반으로 코딩 작업을 하게되면

먼저 2차배열을 저장할 자료구조가 필요하겠죠

int[][] snail = new int[5][5]

그리고

1번 패턴을 적용할 변수가 필요합니다.

int n = 1

2번 패턴을 저장할 변수

int count = 5

3번 패턴을 적용할

int width = -1

int height = 0

증가감소를 제어할 변수

int change = 1

요약하면

int[][] snail = new int[5][5];
int n = 1;
int count = 5;
int width = -1;
int height = 0;
int change = 1;

이란 변수가 필요함을 알 수 있습니다.


2중 반복문을 작성해야되는데

외부 반복문은 3번 패턴이 5번 반복되기때문에

for(int i=0; i<5; i++) {} 작성합니다.


내부 반복문은 width와 height를 반복해야되기때문에 2개를 작성합니다.

for(int j=0; j<count; j++) {}


반복 패턴을 작성해보면

for(int i=0; i<5; i++) {
    for(int j=0; j<count; j++) {
        snail[height][width+=change] = n++;
    }
    count--;
    for(int j=0; j<count; j++) {
        snail[height+=change][width] = n++;
    }
    change *= -1;
}

란 코드로 작성됩니다.


3가지 패턴은 각각

1. 숫자 관점에서

2. for문 반복 횟수 관점에서

3. 배열 인덱스 관점에서

패턴을 찾게 됩니다.


문제 해결 능력이란

여러 관점에서 -> 분석해서 -> 이해하는 능력 혹은 문제 해결 과정이죠

알고리즘을 풀다보면 자연스럽게 여러 관점으로 분석해서 이해를 기반으로 설계하고 검증하게 됩니다.

그래서 알고리즘을 풀면 문제 해결 능력이 생기게 되죠

당연한 말이지만 깊게 이해하면 자연스럽게 응용과 활용이 되겠죠?

일정 수준으로 코딩을 할 수 있으면 경험의 차이로 문제 푸는 속도만 차이날뿐 어떤 문제든 풀 수 있게 됩니다.(분석하는데 시간만 걸릴뿐)


여기까지 문제 해결 능력에 대한 개인적인 견해입니다

너무 당연한 얘기를 장황하게 적은게 아닐까 싶기도 하네요


물론 알고리즘으로 문제 해결 능력을 기를려면 양보단 질이 중요하죠

얼마나 그 문제에 깊게 고민을 했는가..


하지만 알고리즘 테스트를 잘할려면 질보단 양이 중요하더라구요

제한시간안에 빠르게 풀어야 되기때문에 다양한 문제에 익숙해져야되니까...

8
6
  • 댓글 7

  • 아스키
    10k
    2019-08-23 19:21:50

    이렇게 잘 설명을 해주시니..머리에 쏙쏙 들어오는 느낌이 나네요..

    0
  • 로빈풋사과
    2019-08-23 23:17:21

    너무 멋있어요.


    0
  • biipp
    114
    2019-08-24 15:00:10

    질과 양의 대한 균형은 어떤 것을 목표로 공부를 하냐가 중요하다 생각합니다.

    예를 들자면 다음과 같이 

    TCO 마라톤 매치: 대표적인 질이 중요한 매치라고 볼수 있습니다. 하지만 이때의 질은 대회 형식의 문제와 유형이 좀 다릅니다.

    코딩테스트: 전형적인 문제와 유형이 많이 나옵니다. 나올수 있는 범위가 크지 않기에, 익숙치 않은 상황에서는 양을 늘리는 것이 중요합니다.

    ACM-ICPC: 흔히 CP라고 하면 이쪽이고 코드포스나 BOJ, atcoder들도 이에 해당하는 경우가 많습니다. 코테도 이쪽의 영향을 많이 받았습니다. 대회라 그런지 코딩테스트보다 출제 범위가 넓습니다. 이런 매치는 질도 양도 중요합니다. 주어진 시간에 주어진 문제를 풀어야 합니다. 따라서 우선 빠르게 푸는게 중요한데, 이 때에는 양이 중요합니다. 이를 통해 구현력을 높이고, 또한 빠르게 풀어 확보한 시간이 많을 수록 변별력 있는 문제를 풀때에 유리합니다.

    변별력있는 문제를 풀기 위해서는 질이 높은(자신의 실력보다 어려운) 문제를 푸는 것이 중요한데, 생각의 방향을 넓히는데 도움을 줍니다. 이런 연습에는 개인마다 다르겠지만 보통 대회에 나왔던 ProblemSet을 시간제한을 걸고 풀어보고 업솔빙(끝나고 정확하게 풀어보기)를 진행하는 식으로 하곤합니다.

    결국 둘다 중요하다고 생각합니다.



    1
  • 안녕난명훈
    8
    2019-08-27 13:16:00
    제가 쓴글 삭제하려고하는데 거기 댓글 좀 삭제해주세욥
    0
  • 유리세계
    1k
    2019-08-27 14:33:37


    int[][] snail = new int[100][100];
    int n = 0;
    int count = 100;
    int width = 0;
    int height = -1;
    int change = 1;
    
    for(int i=0; i<100; i++) {
        for(int j=0; j<count; j++) {
            snail[height+=change][width] = n++;
        }
        count--;
        for(int j=0; j<count; j++) {
        	snail[height][width+=change] = n++;
        }
        change *= -1;
    }
    
    for (int i = 0; i < snail.length; i++) {
    	for (int j = 0; j < snail[i].length; j++) {
    		String num = snail[i][j] < 10 ? "000"+snail[i][j] : snail[i][j] < 100 ? "00"+snail[i][j] : snail[i][j] < 1000 ? "0"+snail[i][j] : ""+snail[i][j];
    		System.out.print("[" + num + "]");
    	}
    	System.out.println();
    }

    와 재밋네요

    0
  • ISA
    667
    2019-08-28 14:23:42

    괜찮은 글이네요

    0
  • A카노
    500
    2019-09-02 12:59:51

    좋은 글 읽고 갑니다.

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.