[プログラマー]カタツムリ

9767 ワード


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

問題の説明


パラメータは整数nです.下図に示すように、長さと高さnの三角形では、上部頂点から反時計回りにカタツムリ充填を行い、solution関数を完了し、最初の行から最後の行まで順番にマージされた新しい配列を返します.

私の答え

function solution(n) {
    var answer = Array.from(new Array(n), (_, i) => new Array(i+1));
    const totalNum = n*(n+1)/2;
    let sideNum = n;
    const direction = [[1, 0], [0, 1], [-1, -1]];
    let curDirection = 0;
    let x =0;
    let y =0;
    let nx = 0;
    let ny = 0;
    
    
    for (let number =1; number <= totalNum ; number++) {
        answer[x][y] = number;
        
        nx = x + direction[curDirection][0];
        ny = y + direction[curDirection][1];
        
        
        if (number < totalNum && (nx === n || ny === n || !!answer[nx][ny])) {
            curDirection = (curDirection + 1) % 3;
            number--;
        } else {
            x = nx;
            y = ny;
        }
    }
    
    answer = answer.reduce((acc,curr) => {
        return [...acc, ...curr];
    }, '');
    
    return answer;
}

レビュー


初めて問題に触れたとき、パニックになった.
1つ目の方法はn=6で、1つ目の方法はまず一番外側の5つの辺から3つの辺を通り、2つ目の方法は5-3で2つの辺ごとに3つの辺を通り、それからこのようにして1回-3を次の辺に書きます.しかし、このようにすると、最初のn=4のときに、第1段階で3つ、-3を書くと0になり、実際に1つ書くので例外が出てきます.
したがって,次の考え方は,まず方向を表す変数を作成し,次にその方向において次のx,yがどれだけ変化すべきかを表す配列を作成することである.
const direction = [[1, 0], [0, 1], [-1, -1]]; // 아래, 오른쪽, 위
上のコードを下に移動するとx,yは次回+1,+0,右に+0,+1,上に移動すると-1,-1となる.
次に、次の位置を示すnxnyを求め、nxまたはnyがアレイを越えたり、そこに既に値が存在していたりしたら方向を変える.
このとき最後にエラーがあり、最後の数字は次のnxnyでなければならないので、if文の先頭が最後の数字でない場合にのみnxnyをチェックします.