[プログラマー]カタツムリ
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となる.次に、次の位置を示す
nx
、ny
を求め、nx
またはny
がアレイを越えたり、そこに既に値が存在していたりしたら方向を変える.このとき最後にエラーがあり、最後の数字は次の
nx
、ny
でなければならないので、if文の先頭が最後の数字でない場合にのみnx
、ny
をチェックします.Reference
この問題について([プログラマー]カタツムリ), 我々は、より多くの情報をここで見つけました https://velog.io/@j03y14/프로그래머스-삼각달팽이テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol