Bleeding edge

[프로그래머스] 삼각 달팽이 - 자바스크립트 본문

코딩테스트 공부

[프로그래머스] 삼각 달팽이 - 자바스크립트

codevil 2022. 4. 20. 15:12

https://programmers.co.kr/learn/courses/30/lessons/68645

 

코딩테스트 연습 - 삼각 달팽이

5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] 6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]

programmers.co.kr

 

개인적으로, 이 문제는, 내가 코딩테스트를 하면서 수정하거나 신경써야할걸 많이 알려준 문제라고 생각한다. 우선 이문제는 한 4회정도..? (1회차당 하루다) 시도해봤었던 문제인데, 다풀렸다 했을때 항상 error를 못잡았던 기억이 있다. 지금와서 생각해보면 문제풀이에 부족했었던걸 정리해보았다.

1. typeof 문제, 문제풀이에서 Numer와 String가 삽입되거나 합쳐질때, 전환을 잘신경 못쓰는거 같다(그래도 많이 좋아졌지만)

2. x, y graph 문제, x, y 변수 두개가 있는 그래프의 경우에는, x, y를 움직이는데 있어서, out of range의 케이스에서 error가 발생하는데, 오늘 와서 보니 out of range를 막는 조건을 잘 막는다했는데 error가 생기는 경우에는, 조건문을 두개로 나눠서 하니 좀 더 잘 되는거 같았다. 그러니 줄이 늘어나는 것보다 쪼갤때는 쪼개야 한다는 생각이 들었다.

아래는 문제 풀이이다. 

 

function solution(n) {
    // var answer = [];
    // return answer;
    let max = n*(n+1)/2
    let graph = []
    for(let i =0;i<n;i++){
        let list = []
        for(let j=0;j<n;j++){
            list.push(0)
        }
        graph.push(list)
    }
    let x=0;
    let y=0;
    let dir = [[0,1], [1,0], [-1, -1]];
    let d = 0
    for(let i=1;i<max+1;i++){
        graph[y][x] =i
        if((y===n-1&&x===0)||(x===n-1&&y===n-1)){
            if(d==2){
            d = 0
            }else{
             d++   
            }
        }
        if(graph[Number(y)+ Number(dir[d][1])][Number(x)+ Number(dir[d][0])] !==0){
                if(d==2){
            d = 0
            }else{
             d++   
            }
        }
        x = Number(x)+ Number(dir[d][0])
        y =Number(y)+ Number(dir[d][1])
    }
    const regex = /(,0)/g;
    return graph.join(',').replace(regex, '').split(',').map((v)=>Number(v))
}