직각삼각형 만들기
정보처리기사 실기 알고리즘 문제에 직각삼각형 안에 값을 넣는 그런 문제들이 있어서
그럼 근본적으로 직각삼각형을 어떻게 만드는지에 대하여 알아볼 것이다.
일단 예시로 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 |
다음과 같이 표현할 수 있다.
직각삼각형을 배열 내에서 만드는 법을 살펴보았다.
이는 배열의 번지수인 인덱스번호의 규칙성만 파악할 수 있다면
간단하게 만들 수 있는 알고리즘임을 꼭 생각하자!
'알고리즘 문제 풀어보기' 카테고리의 다른 글
[카카오/신입공채] 다트게임 (2017/09/27) (0) | 2019.02.08 |
---|---|
[백준 2501번] 약수 구하기 (0) | 2019.02.07 |
최대공약수, 최소공배수 구하기 알고리즘(+약수 구하기) (0) | 2019.01.26 |
[백준 1475] 방 번호 문제 (0) | 2019.01.24 |
[백준 8958번] OX퀴즈 (0) | 2019.01.24 |