sprial matrix문제를 해결하고 비슷하게 생긴 삼각 달팽이 문제를 풀어보았다.
문제에서는 정삼각형 모양이지만 나는 📐 이 모양같은 직각삼각형이라고 생각하고 해결했다.
문제 : 프로그래머스__삼각달팽이
sprial matrix와 같이 start/end-row/colum 을 설정해주어서 해결하고 싶었지만, 삼각형이기 때문에 대각선으로 올라가 endColumn
을 이용해 대각선 라인을 채우기 어려웠다.
그래서 cnt라는 변수를 이용해 대각선을 채울 때 마지막 column을 계산해주었다.
맨 왼쪽줄
맨 왼쪽 줄을 채운뒤에는 맨 첫번째 Array가 꽉 차기 때문에 startColumn
과 startRow
까지 ++ 해준다.
맨 아래줄
맨 아래줄을 채우면 삼각형이기 때문에 endRow
와 endColumn
까지 --해준다.
대각선
대각선은 대각선이 한번지나가면 count를 세는 cnt
변수를 설정했다.
배열의 마지막 값 arr.length-1
에 cnt
를 빼 주었다.
function solution(n) {
const results = []
for (let i = 1 ; i <=n ; i ++){
results.push(Array.from({length:i},()=>0))
}
let counter = 1,startColumn=0,startRow=0,endRow=n-1,endColumn=n-1,cnt=0;
while (startColumn<=endColumn&&startRow<=endRow){
//맨왼쪽줄
for (let i = startRow; i<=endRow; i++){
results[i][startColumn]=counter
counter++
}
startRow++
startColumn++
//맨아래줄
for (let i = startColumn; i<=endColumn; i++){
results[endRow][i]=counter
counter++
}
endColumn--
endRow--
//대각선줄
for(let i = endRow; i>=startRow; i--){
results[i][results[i].length-1-cnt]=counter
counter++
}
endColumn--
startRow++
cnt++
}
return results.flat();
}
flat 메소드를 이용해 2차원 배열을 간단하게 1차원 배열로 바꿀 수 있었다.
const answer=[]
for (let i = 0; i<n; i ++){
for(let x of results[i]){
answer.push(x)
}
}
==> results.flat()
이렇게 해주면된다.
sprial matrix와 비슷하기는 한데 대각선 부분이 달라서 대각선 부분에서 고민을 많이했다.