카테고리 없음

kotlin 프로그래머스 lv2 삼각 달팽이

crablo 2024. 3. 25. 13:48
728x90

해당 문제를 읽고나서 배열의 크기와 삼각형이 채워지는 방향에대해 생각하게 되었다.

배열의 크기는 수열의 합공식으로 적용되어 코드를 아래와 같이 작성했다.

val answer = IntArray((n*(n+1))/2)

반시계방향이므로 숫자가 채워지는 방향이 y는 아래로 커지는 방향으로 x는 오른쪽으로 커지는방향으로 마지막으로 좌상단으로 이동할때는 x와 y가 작아지는 방향으로 이동한다.

그래서 코드를 아래와 같이 작성했다.

val directions = arrayOf(intArrayOf(1,0),intArrayOf(0,1),intArrayOf(-1,-1))  //[[1,0],[0,1],[-1,-1]]

해당 코드는 삼각형을 채우기 위한 방향을 나타내고, 아래방향으로 y좌표가 증가하고 [0,1] 로 작성했다.

우측방향으로 x좌효가 증가하고 [1,0]로 작성했다.

좌상단 방향으로 x,y 둘다 감소하고, [-1,-1]로 작성했다.

var num = 1 //현재 채워진 값

var row = 0 //현재 행

var col = 0 //현재 열

var directionIdx = 0 //방향 인덱스

그 후 dfs방식을 통해 삼각형을 채워나갔다.

 

※dfs 알고리즘
DFS(깊이 우선 탐색) 알고리즘은 그래프나 트리와 같은 자료구조에서 사용되는 탐색 알고리즘 중 하나이다.
이 알고리즘은 특정한 경로를 따라 최대한 깊이까지 탐색한 후, 더 이상 탐색할 수 없을 때 다시 돌아와 다른 경로로 탐색을
진행한다.



먼저 현재 채울 숫자(num)가 삼각형의 총 요소 수보다 작거나 같을 때까지 다음을 반복한다.

-현재 위치에 현재 숫자를 결과 배열에 채운다.

-현재 위치와 방향을 기반으로 다음 위치를 계산한다.

-다음 위치가 삼각형의 범위 내에 있고, 셀이 비어있으면 다음 위치로 이동한다.

그렇지 않으면 방향을 변경하고 이동한다.

-다음 반복을 위해 현재 숫자(num)을 업데이트한다.

코드는 아래와 같이 작성했다.

결과는 예상대로 잘 나왔다.

dfs문제를 많이 풀어봐야될것 같다.

728x90