간단한 반복문이라면 그냥 쉽게 쓸 수 있다.
하지만 피보나치 수열을 다루거나, 이중 반복문을 다룬다면 그때부터 문제가 복잡해지는 것 같다.
나는 처음부터 머리가 좋은 사람도 아니고, 수학도 수능에서 겨우 3등급을 받았다. 수학은 그냥 외워서 기본 점수 정도만 받아가는 정도여서, 결코 머리가 뛰어나게 좋진 않다.
나와 같은 보통의 사람들은 알고리즘(반복문)을 바로 짜는 것이 쉽지 않기 때문에 하나씩 수를 대입하고, 그 수에 대해서 어떤 결과가 나오고, 그것을 여러 번 반복하여 일정한 패턴을 찾아내는 방식으로 문제를 푸는 방식이 좋다고 생각한다. 작게 작게 단계를 쪼개는 것이다.
예를 들어 다음과 같은 숫자 패턴이 있다면 ,
당신은 이 숫자 패턴을 코드로 출력하기 위해 어떻게 문제에 접근할 것인가?
1,112,112123,1121231234,112123123412345
우선, 각각의 단계에 대해 어떤 일이 일어나고 있는지 분석을 해야 한다
1단계 : 1
2단계 : 1과 12를 붙임
3단계 : 1, 12, 123을 붙임
4단계 : 1, 12, 123, 1234를 붙임
우선 이전 단계와 비교했을 때 뭐가 다른지를 찾는다. 위에서는 연속된 수열이 단계를 거치면서 길이가 1이 늘어났고, 기존의 것에 붙어있다는 것을 알 수 있다.
또한, 각 단계 안을 자세히 보면, 1 세부단계를 지날때마다 1씩 늘어난 숫자가 하나씩 더 붙는 것을 알 수 있다.
결국 정리하면, 반복문 안에 반복문이 있는 이중 반복문임을 알 수 있다.
이것을 이제 일반화시키게 되면 반복문 코드를 작성할 수 있다.
이렇게 생각하는 것이다.
1,2,3,4단계는 결과가 이러했으니, i 단계에서는 어떤 패턴을 예상할 수 있는가?
그렇다면 다음과 같이 정리가 될 것이다.
1단계 : 1
2단계 : 1과 12를 붙임
3단계 : 1, 12, 123을 붙임
4단계 : 1, 12, 123, 1234를 붙임
i단계 : 1, 12, ...... , 123...i를 붙임
그리고 i 단계 안에서는 다음과 같이 정리가 될 것이다.
1세부단계 : 1
2세부단계 : 12
3세부단계 : 123
4세부단계 : 1234
j 세부단계: 1234...j
이제 이것을 반복문으로 정리해 보자.
let result = '';
for(let i = 0 ; i < num ; i++){
for( let j = 0 ; j <= i ; j++){
result = result + j;
}
}
결국 핵심은 직접 수를 대입해보고, 어떤 결과가 나와야 하는지 적은 다음, 일반화할 수 있는 패턴을 찾을 수 있어야 한다. 이게 반복문의 핵심이다.
처음부터 바로 반복문을 짜려 하면 어려울 것이다. 작은 단계부터 하나씩 만들어 나가자.