表の編集:falsey値に注意!
falsey値とは?
falsy
値はBoolean
文脈false
により評価される値である.false値タイプ
falsy
値は8種類あります.false
0
:数字0-0
:負数00n
: BigInt 0 ""
:空弦null
:無価undefined
NaN
:数字ではないCOTEで..。
falsy
値については知っていますが、実際にはコードテストの練習中に感じたことに注意してください.2021年KACA採用連絡型実習問題です.
2021ココア採用連絡型実習-表の編集
当時のゲーテの後記を探せば、この問題がゲーテ部門の党派を分裂させたことがわかる.
△これは3番目の問題で、4、5番目の問題はそれぞれLv.4、Lv.5です.
最初は簡単なリスト解題だったが,効率部門は通過しなかったため,リストにオブジェクトを加え,双方向リストのような操作を実現した.
const list = [];
for (let i = 0; i < n; i++) {
if (i == 0)
list[i] = {prev : null, next : i + 1, exist: true};
else if (i === n - 1)
list[i] = {prev : i - 1, next : null, exist: true};
else
list[i] = {prev : i - 1, next : i + 1, exist: true};
}
次に、入力した各コマンドに対して実行する論理を示します.cmd.forEach((command) => {
const [order, num] = command.split(' ');
if (order === 'U') {
let t = parseInt(num);
while (t--) {
cursor = list[cursor].prev;
}
} else if (order === 'D') {
let t = parseInt(num);
while (t--) {
cursor = list[cursor].next;
}
} else if (order === 'C') {
const {prev, next} = list[cursor];
// 연결리스트 삭제와 유사 (실제로 배열에서 사라지지는 않음)
if (prev) list[prev].next = next;
if (next) list[next].prev = prev;
list[cursor].exist = false;
deleted.push(cursor);
cursor = next === null ? prev : next;
} else if (order === 'Z') {
const repaired = deleted.pop();
const {prev, next} = list[repaired];
// 삭제 전으로 돌아가게 만듬
if (prev) list[prev].next = repaired;
if (next) list[next].prev = repaired;
list[repaired].exist = true;
}
})
このロジックはよく動作しているように見えますが、28番のテストケース、8番の効率ケースでは実行時エラーが発生します.何日か悩んだあげく、友達(@dha)の助けで見つけた.
...
if (prev) list[prev].next = next; // prev에 0이 들어올 수 있음
...
if (prev) list[prev].next = repaired;
...
なぜなら、null
条件文に入っている0が条件文を通過しないようにするためです.(prev,nextにはインデックスが格納されているので、0を入力できます.)
本当にでたらめなミスだ...
正しく修正されたコードは次のとおりです.
cmd.forEach((command) => {
const [order, num] = command.split(' ');
if (order === 'U') {
let t = parseInt(num);
while (t--) {
cursor = list[cursor].prev;
}
} else if (order === 'D') {
let t = parseInt(num);
while (t--) {
cursor = list[cursor].next;
}
} else if (order === 'C') {
const {prev, next} = list[cursor];
if (prev !== null) list[prev].next = next; // null 검사
if (next !== null) list[next].prev = prev; // null 검사
list[cursor].exist = false;
deleted.push(cursor);
cursor = next === null ? prev : next;
} else if (order === 'Z') {
const repaired = deleted.pop();
const {prev, next} = list[repaired];
if (prev !== null) list[prev].next = repaired; // null 검사
if (next !== null) list[next].prev = repaired; // null 검사
list[repaired].exist = true;
}
})
の最後の部分 fasly
値段を知ったばかりの頃は、単に字を書くのは気をつけなければならないと思っていたのが過ぎてしまったので、それを機に考えが変わりました.
単純にcoteを練習するとき、書き間違えたコードをつかむために何日かかかりましたが、実際の符号化テストなら?falsy
チェックしていないので論理的に考えても落ちてくる.私はいつでも愚かな間違いを犯すことを認めます.文章を書くときは正確に書く習慣を身につけなければなりません.
Reference
この問題について(表の編集:falsey値に注意!), 我々は、より多くの情報をここで見つけました
https://velog.io/@sj_dev_js/JavaScript-프로그래머스-표-편집-falsy-값에-유의하자
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
Reference
この問題について(表の編集:falsey値に注意!), 我々は、より多くの情報をここで見つけました https://velog.io/@sj_dev_js/JavaScript-프로그래머스-표-편집-falsy-값에-유의하자テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol