처음부터 차근차근
달팽이 배열 알고리즘 본문
달팽이 배열은 아래의 이미지 처럼 달팽이 집 처럼 생긴 배열을 말한다.
아래와 같이 값을 저장해주는 알고리즘을 구현해봤다.
문제 분석
1. 2차원 배열 선언 = A(5, 5) = A(R, C) = A(행, 열)
2. V=0, count=5, C=0, R=1, PlusMinus=1 V : 배열에 넣을 값, count : 반복문, 조건문에 사용될 변수, C : 열, R : 행, PlusMinus : 증, 감 결정하는 변수
3. 1 ~ 25까지 V = V + 1(1씩 증가)
나중에 A(R, C) 배열에다 V 값 저장
4. 진행 방향(달팽이 모양) = 1행(가로) -> 2행(세로) -> 3행 -> 4행 -> 5행(가로) -> 4행(세로) -> 3행 -> 2행(가로) -> 3행(세로) -> 4행(가로) -> 3행(가로)
5. For문
(1) 1회 : for i = 1 to 5(count = 5) -> 5회 반복
배열에 들어갈 값에 +1 -> V + 1
열 변수에 +1 -> C + 1
A[1][1]=1, A[1][2]=2, A[1][3]=3, A[1][4]=4, A[1][5]=5 -> 행(R)은 1 고정, 열(C) 변화 1~5
For문 반복 횟수 감소 -> count--, count = 4가 됨
(2) 2회 : for i = 1 to 4(count = 4) -> 4회 반복
배열에 들어갈 값에 +1 -> V + 1
행 변수에 +1 -> R + 1
A[2][5]=6, A[3][5]=7, A[4][5]=8, A[5][5]=9 -> 행(R)은 변화 2~5, 열(C) 5 고정
증, 감 결정하는 변수 감소 -> PlusMinus * -1 = -1
(3) 3회 : for i = 1 to 4(count = 4) -> 4회 반복
배열에 들어갈 값에 +1 -> V + 1
열 변수에 +1 -> C - 1
A[5][4]=10, A[5][3]=11, A[5][2]=12, A[5][1]=13 -> 행(R)은 5 고정, 열(C) 변화 4~1
For문 반복 횟수 감소 -> count--, count = 3이 됨
(4) 4회 : for i = 1 to 3(count = 3) -> 3회 반복
배열에 들어갈 값에 +1 -> V + 1
행 변수에 +1 -> R - 1
A[4][1]=14, A[3][1]=15, A[2][1]=16 -> 행(R)은 변화 4~2, 열(C) 1 고정
증, 감 결정하는 변수 감소 -> PlusMinus * -1 = 1
(5) 5회 : for i = 1 to 3(count = 3) -> 3회 반복
배열에 들어갈 값에 +1 -> V + 1
열 변수에 +1 -> C + 1
A[2][2]=17, A[2][3]=18, A[2][4]=19 -> 행(R)은 2 고정, 열(C) 변화 2~4
For문 반복 횟수 감소 -> count--, count = 2이 됨
(6) 6회 : for i = 1 to 2(count = 2) -> 2회 반복
배열에 들어갈 값에 +1 -> V + 1
행 변수에 +1 -> R + 1
A[3][4]=20, A[4][4]=21 -> 행(R)은 변화 3~4, 열(C) 4 고정
증, 감 결정하는 변수 감소 -> PlusMinus * -1 = -1
(7) 7회 : for i = 1 to 2(count = 2) -> 2회 반복
배열에 들어갈 값에 +1 -> V + 1
열 변수에 +1 -> C - 1
A[4][3]=22, A[4][2]=23 -> 행(R)은 4 고정, 열(C) 변화 3~2
For문 반복 횟수 감소 -> count--, count = 1이 됨
(8) 8회 : for i = 1 to 1(count = 1) -> 1회 반복
배열에 들어갈 값에 +1 -> V + 1
행 변수에 +1 -> R - 1
A[3][2]=24
증, 감 결정하는 변수 감소 -> PlusMinus * -1 = 1
(9) 9회 : for i = 1 to 1(count = 1) -> 1회 반복
배열에 들어갈 값에 +1 -> V + 1
열 변수에 +1 -> C + 1
A[3][3]=25
For문 반복 횟수 감소 -> count--, count = 0이 됨
절차(순서도)
로직(알고리즘) 검증
변수 : V = 0, count = 5, C = 0, R = 1, PlusMinus = 1 | |||||||||||
cycle | For i=1 to count count = 5 |
V++ | C+=PlusMinus | A[R][C]=V | count-- | count>0 | For i=1 to count count = 4 |
V++ |
R+=PlusMinus | A[R][C]=V |
PlusMinus*=-1 |
1 | i=1 | V=1 | C=1 | A[1][1]=1 | 5-1=4 count=4 |
True | i=1 | V=6 | R=2 | A[2][5]=6 | 1*(-1)=(-1) PlusMinus=-1 |
i=2 | V=2 | C=2 | A[1][2]=2 | i=2 | V=7 | R=3 | A[3][5]=7 | ||||
i=3 | V=3 | C=3 | A[1][3]=3 | i=3 | V=8 | R=4 | A[4][5]=8 | ||||
i=4 | V=4 | C=4 | A[1][4]=4 | i=4 | V=9 | R=5 | A[5][5]=9 | ||||
i=5 | V=5 | C=5 | A[1][5]=5 | ||||||||
For i=1 to count count = 4 |
V++ | C+=PlusMinus | A[R][C]=V | count-- | count>0 | For i=1 to count count = 3 |
V++ |
R+=PlusMinus | A[R][C]=V | PlusMinus*=-1 | |
2 | i=1 | V=10 | C=4 | A[5][4]=10 | 4-1=3 count=3 |
True |
i=1 | V=14 | R=4 | A[4][1]=14 | (-1)*(-1)=1 PlusMinus=1 |
i=2 | V=11 | C=3 | A[5][3]=11 | i=2 | V=15 | R=3 | A[3][1]=15 | ||||
i=3 | V=12 | C=2 | A[5][2]=12 | i=3 | V=16 | R=2 | A[2][1]=16 | ||||
i=4 | V=13 | C=1 | A[5][1]=13 |
C로 구현
출처 : 자료구조(21-1학기) 박승기교수 강의 내용 변형 및 요약
'알고리즘' 카테고리의 다른 글
평균 넘는 사람 비율 구하기 (0) | 2022.09.24 |
---|---|
최댓값, 최솟값 구하기 (0) | 2022.09.22 |
투포인터 알고리즘 (0) | 2022.09.15 |
DSDV 알고리즘과 Link State 알고리즘 (0) | 2022.04.01 |
스케줄링 알고리즘 (0) | 2021.10.04 |