본문 바로가기

알고리즘 문제 풀어보기

5x5 배열에 직각삼각형 만들기

직각삼각형 만들기



정보처리기사 실기 알고리즘 문제에 직각삼각형 안에 값을 넣는 그런 문제들이 있어서

그럼 근본적으로 직각삼각형을 어떻게 만드는지에 대하여 알아볼 것이다.


일단 예시로 5x5배열에 직각삼각형을 만들어 볼텐데 배열 칸수는 상관없이 정사각형 모양이면 된다.


정사각형꼴의 배열에 직각삼각형은 총 4가지 경우의 모양으로 나오는데 하나씩 살펴보자



1번째 경우



배열로 생각해서 본다면 arr[i][j]에서

i = 0,  j = 0

i = 1,     j = 0, 1

i = 2,        j = 0, 1, 2

i = 3,           j = 0, 1, 2, 3

i = 4,              j = 0, 1, 2, 3, 4


인덱스 번호에 다음과 같은 규칙성이 나타난 것을 알 수 있다.

j의 시작점은 0으로 고정인데 반해,

j의 끝부분은 i와 같은 값이 나온다.

이는 이중반복문을 통해 나타낸다면


1
2
3
4
5
6
7
8
9
int n = 1;
    //첫 번째 직각삼각형
    for (i = 0; i <= 4; i++)
        for (j = 0; j <= i; j++)
        {
            arr1[i][j] = n;
            n++;
            
        }
cs

다음과 같이 나타낼 수 있다.



2번째 경우



이 역시 인덱스의 규칙성을 보면

i = 0,              j = 4

i = 1,           j = 3, 4

i = 2,        j = 2, 3, 4

i = 3,     j = 1, 2, 3, 4

i = 4,  j = 0, 1, 2, 3, 4

이 규칙을 보면 j의 끝은 4로 고정이고,

j의 시작점이 바뀌는 것을 알 수 있다.

j의 시작점은 i = 0일 때 4, i = 1일 때 3 ... i = 4일 때 0인 것을 봐서

j의 시작점 = 4 - i 인 것을 알 수 있다.

(지금 배열이 5x5라서 4이지 NxN 배열인 경우 (N-1) - i 이다.)

또한 시작점은 점점 감소하고 있으므로 이를 나타낸다면


1
2
3
4
5
6
7
8
//두 번째 직각삼각형
    n = 1;
    for (i = 0; i <= 4; i++)
        for (j = 4 - i; j >= 0; j--)
        {
            arr2[i][j] = n;
            n++;
        }
cs

다음과 같이 나올 것이다.



3번째 경우



인덱스의 규칙성을 살펴보면

i = 0,             j = 0 ,1, 2, 3, 4

i = 1,          j = 0, 1, 2, 3

i = 2,       j = 0, 1, 2

i = 3,    j = 0, 1

i = 4, j = 0


j의 시작점은 0으로 고정이며

j의 끝부분은 바뀐다.

보면 j의 끝부분은 4 - i 로 변경이 되고 있음을 알 수 있다.

그러므로 이는


1
2
3
4
5
6
7
8
//세 번째 직각삼각형
    n = 1;
    for (i = 0; i <= 4; i++)
        for (j = 0; j <= (4 - i); j++)
        {
            arr3[i][j] = n;
            n++;
        }
cs



4번째 경우



인덱스의 규칙성을 보면

i = 0,  j = 0, 1, 2, 3, 4

i = 1,     j = 1, 2, 3, 4

i = 2,        j = 2, 3, 4

i = 3,           j = 3, 4

i = 4,              j = 4


j의 시작점이 i와 같고

j의 끝부분은 4로 고정이다.

이는 곧,


1
2
3
4
5
6
7
8
    //네 번째 직각삼각형
    n = 1;
    for (i = 0; i <= 4; i++)
        for (j = i; j <= 4; j++)
        {
            arr4[i][j] = n;
            n++;
        }
cs

다음과 같이 표현할 수 있다.


직각삼각형을 배열 내에서 만드는 법을 살펴보았다.

이는 배열의 번지수인 인덱스번호의 규칙성만 파악할 수 있다면

간단하게 만들 수 있는 알고리즘임을 꼭 생각하자!