JavaScriptmain.js · 41 行const lines = require("fs").readFileSync(0, "utf8").split("\n"); // 문자열 토막 하나를 JavaScript 값으로 바꾼다function parse(token) { if (token.startsWith('"')) return token.slice(1, -1); // "5" → 문자열 5 if (token === "true") return true; if (token === "false") return false; if (token === "null") return null; if (token === "undefined") return undefined; if (token === "NaN") return NaN; return Number(token); // -0 도 그대로 -0} const values = lines[1].trim().split(" ").map(parse); // 앞에서부터 보며, 이미 남긴 값 가운데 같은 것이 없으면 남긴다. 남긴 자리(1부터)를 돌려준다function keepFirst(same) { const kept = []; values.forEach((v, i) => { if (!kept.some((j) => same(values[j], v))) kept.push(i); }); return kept.map((i) => i + 1);} // Set은 SameValueZero: NaN끼리 같고, 0과 -0도 같다function keepFirstBySet() { const seen = new Set(); const kept = []; values.forEach((v, i) => { if (!seen.has(v)) { seen.add(v); kept.push(i + 1); } }); return kept;} const results = [ keepFirst((a, b) => a == b), keepFirst((a, b) => a === b), keepFirst(Object.is), // NaN끼리 같고, 0과 -0은 다르다 keepFirstBySet(),];console.log(results.map((kept) => [kept.length, ...kept].join(" ")).join("\n"));
TypeScriptmain.ts · 45 行import { readFileSync } from "node:fs"; type Value = string | number | boolean | null | undefined; // 문자열 토막 하나를 JavaScript 값으로 바꾼다function parse(token: string): Value { if (token.startsWith('"')) return token.slice(1, -1); if (token === "true") return true; if (token === "false") return false; if (token === "null") return null; if (token === "undefined") return undefined; if (token === "NaN") return NaN; return Number(token); // -0 도 그대로 -0} const lines: string[] = readFileSync(0, "utf8").split("\n");const values: Value[] = lines[1].trim().split(" ").map(parse); // 앞에서부터 보며, 이미 남긴 값 가운데 같은 것이 없으면 남긴다. 남긴 자리(1부터)를 돌려준다function keepFirst(same: (a: Value, b: Value) => boolean): number[] { const kept: number[] = []; values.forEach((v, i) => { if (!kept.some((j) => same(values[j], v))) kept.push(i); }); return kept.map((i) => i + 1);} // Set은 SameValueZero: NaN끼리 같고, 0과 -0도 같다function keepFirstBySet(): number[] { const seen = new Set<Value>(); const kept: number[] = []; values.forEach((v, i) => { if (!seen.has(v)) { seen.add(v); kept.push(i + 1); } }); return kept;} // 매개변수가 합친 타입(Value)이라 TS도 == 를 허락한다const results: number[][] = [ keepFirst((a, b) => a == b), keepFirst((a, b) => a === b), keepFirst(Object.is), // NaN끼리 같고, 0과 -0은 다르다 keepFirstBySet(),];console.log(results.map((kept) => [kept.length, ...kept].join(" ")).join("\n"));