๐ ํ๋ก๊ทธ๋๋จธ์ค 42576 : ์์ฃผํ์ง ๋ชปํ ์ ์ - Javascript
2023-02-02
๋ฌธ์ ์ค๋ช
์๋ง์ ๋ง๋ผํค ์ ์๋ค์ด ๋ง๋ผํค์ ์ฐธ์ฌํ์์ต๋๋ค. ๋จ ํ ๋ช ์ ์ ์๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ์ ์๊ฐ ๋ง๋ผํค์ ์์ฃผํ์์ต๋๋ค.
๋ง๋ผํค์ ์ฐธ์ฌํ ์ ์๋ค์ ์ด๋ฆ์ด ๋ด๊ธด ๋ฐฐ์ด participant์ ์์ฃผํ ์ ์๋ค์ ์ด๋ฆ์ด ๋ด๊ธด ๋ฐฐ์ด completion์ด ์ฃผ์ด์ง ๋, ์์ฃผํ์ง ๋ชปํ ์ ์์ ์ด๋ฆ์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
- ๋ง๋ผํค ๊ฒฝ๊ธฐ์ ์ฐธ์ฌํ ์ ์์ ์๋ 1๋ช ์ด์ 100,000๋ช ์ดํ์ ๋๋ค.
- completion์ ๊ธธ์ด๋ participant์ ๊ธธ์ด๋ณด๋ค 1 ์์ต๋๋ค.
- ์ฐธ๊ฐ์์ ์ด๋ฆ์ 1๊ฐ ์ด์ 20๊ฐ ์ดํ์ ์ํ๋ฒณ ์๋ฌธ์๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- ์ฐธ๊ฐ์ ์ค์๋ ๋๋ช ์ด์ธ์ด ์์ ์ ์์ต๋๋ค.
์ ์ถ๋ ฅ ์
participant | completion | return |
---|---|---|
[โleoโ, โkikiโ, โedenโ] | [โedenโ, โkikiโ] | โleoโ |
[โmarinaโ, โjosipaโ, โnikolaโ, โvinkoโ, โfilipaโ] | [โjosipaโ, โfilipaโ, โmarinaโ, โnikolaโ] | โvinkoโ |
[โmislavโ, โstankoโ, โmislavโ, โanaโ] | [โstankoโ, โanaโ, โmislavโ] | โmislavโ |
์์ #1
โleoโ๋ ์ฐธ์ฌ์ ๋ช ๋จ์๋ ์์ง๋ง, ์์ฃผ์ ๋ช ๋จ์๋ ์๊ธฐ ๋๋ฌธ์ ์์ฃผํ์ง ๋ชปํ์ต๋๋ค.์์ #2
โvinkoโ๋ ์ฐธ์ฌ์ ๋ช ๋จ์๋ ์์ง๋ง, ์์ฃผ์ ๋ช ๋จ์๋ ์๊ธฐ ๋๋ฌธ์ ์์ฃผํ์ง ๋ชปํ์ต๋๋ค.์์ #3
โmislavโ๋ ์ฐธ์ฌ์ ๋ช ๋จ์๋ ๋ ๋ช ์ด ์์ง๋ง, ์์ฃผ์ ๋ช ๋จ์๋ ํ ๋ช ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ํ๋ช ์ ์์ฃผํ์ง ๋ชปํ์ต๋๋ค.
ํ์ด ๊ณผ์
์ ์ฒด ์ ์(participant) ์ค ์์ฃผํ ์ ์(completion) ๋ชฉ๋ก์ ์กด์ฌํ์ง ์๋ ์ ์ ํ ๋ช ์ ์ฐพ์๋ด์ผ ํฉ๋๋ค.
์๋ 1
splice
์ indexOf
๋ฅผ ์ด์ฉํด ์์ฃผํ ์ ์(completion)๋ฅผ ์ ์ฒด ์ ์(participant)์์ ํ๋์ฉ ์๊ฑฐํ ๋ค, ๋จ์ ํ ์ ์์ ์ด๋ฆ์ ๋ฐํํ๋ ๋ฐฉ์์ผ๋ก ํ์ด๋ดค์ต๋๋ค.
function solution(participant, completion) {
// ์ ์ฒด ์ ์ ๋ชฉ๋ก์์ ์์ฃผํ ์ ์์ ์ด๋ฆ์ ํ๋์ฉ ์๊ฑฐ
for (name of completion) {
participant.splice(participant.indexOf(name), 1);
}
// ์ ์ฒด ์ ์ ๋ชฉ๋ก์์ ๋จ์์๋ ์ ์์ ์ด๋ฆ์ ๋ฐํ
return participant[0];
}
ํ์ง๋ง ์ ํ๋ ํ
์คํธ๋ ํต๊ณผํ๊ณ ์๊ฐ ์ด๊ณผ๋ก ํจ์จ์ฑ ํ
์คํธ๋ ํต๊ณผํ์ง ๋ชปํ์ต๋๋ค. ๋ฐฐ์ด์ ์์ ํ๋ splice
๊ฐ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ์๊ธด ๋ฌธ์ ์ธ ๋ฏ ํฉ๋๋ค.
์๋ 2
์๋์ ๊ฐ์ด ํด์ฌ๋ฅผ ์ด์ฉํด ๋ฌธ์ ๋ฅผ ๋ค์ ํ์๊ณ , ์ฑ๊ณต์ ์ผ๋ก ํจ์จ์ฑ ํ ์คํธ๊น์ง ํต๊ณผํ์ต๋๋ค.
function solution(participant, completion) {
// ์์ฃผํ ์ ์์ ์ด๋ฆ์ ๊ฐ์๋ฅผ ์ ์ฅํ ๋ณ์ ์ ์ธ
const counts = {};
// ์์ฃผํ ์ ์์ ์ด๋ฆ์ ๊ฐ์๋ฅผ `counts` ๋ณ์์ ๋ด๊ธฐ
for (name of completion) {
if (counts[name]) {
counts[name]++;
} else {
counts[name] = 1;
}
}
for (name of participant) {
if (counts[name]) {
counts[name]--; // ์ ์ ์ด๋ฆ์ด ์์ผ๋ฉด ๊ฐ์ 1 ๊ฐ์
} else {
return name; // ์ ์ ์ด๋ฆ์ด ์๊ฑฐ๋ 0์ด๋ฉด ํด๋น ์ ์์ ์ด๋ฆ์ ๋ฐํ
}
}
}
์์ฝ๋ฉ (CodeGolf)
์กฐ๊ธ ๋ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ๋ฐ๊พธ๊ธฐ ์ํด ์กฐ๊ฑด์ ๋ถ๋ถ์ ์์ ํด ์๋์ ๊ฐ์ด ์ ๋ฆฌ ๊ฐ๋ฅํฉ๋๋ค.
function solution(participant, completion) {
const counts = {};
for (name of completion) counts[name] = (counts[name] | 0) + 1;
for (name of participant) if (!counts[name]--) return name;
}
counts
์ name
์ด ์์ ์๋ ์๋๋ฐ !counts[name]--
์ด ์ ์ ๋๋ก ์๋ํ๋์?
counts[name]
๊ฐ ๋น์ด์์ ๊ฒฝ์ฐ ์ ๊ทผํ๋ฉดundefined
๋ฅผ ๋ฐํํฉ๋๋ค.undefined
๊ฐ ์ฐ์ ์ฐ์ฐ์์ ๋ง๋๋ฉด ์ค๋ฅ ์์ดNaN
์ผ๋ก ๋ฐ๋๊ฒ ๋ฉ๋๋ค.NaN
์ ๋ ผ๋ฆฌ๊ฐ ๊ฑฐ์ง์ผ๋ก ๋ณํ๋๊ธฐ ๋๋ฌธ์,!NaN
์true
๋ก ๋ณํ๋ฉ๋๋ค.
- ๋ฐ๋ผ์
counts[name]
์ด ์กด์ฌํ์ง ์์ ๋,!counts[name]--
๋true
์ผ๋ก ๋ณํ๋ฉ๋๋ค.
์ด๋ฌํ ๊ณผ์ ์ ํตํด ๋งคํ๋ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ ์์ ์ด๋ฆ์ ๋ฐํํ๋ ๋ก์ง์ด ์ ์์ ์ผ๋ก ์๋ํ๊ฒ ๋ฉ๋๋ค.
์ถ๊ฐ๋ก counts
๊ฐ์ฒด ์์ฑ ๋ผ์ธ์ ์ ๊ฑฐํ๊ณ completion
๋ฐฐ์ด์ ํด์ฌ๋งต ์ฉ๋๋ก ์ฌ์ฌ์ฉํฉ๋๋ค.
function solution(participant, completion) {
for (name of completion) completion[name] = (completion[name] | 0) + 1;
for (name of participant) if (!completion[name]--) return name;
}
completion
๋ ๋ฐฐ์ด์ธ๋ฐ ์ด๋ป๊ฒ ํค๊ฐ์ ์ธ๋ฑ์ค๋ก ์ฌ์ฉ ํ ์ ์๋์?
- ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋ฐฐ์ด ๋ํ
Array
๋ผ๋ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์์ฑ(property)์ ์ถ๊ฐํ ์๊ฐ ์์ต๋๋ค. - ๋ฐ๋ผ์
completion[name]
์ด๋ผ๋ ์ฝ๋๊ฐ ์ ์์ ์ผ๋ก ์๋ํ๊ฒ ๋ฉ๋๋ค.
for-of
๋ฅผ map()
๊ณผ find()
๋ฉ์๋๋ก ๋ฐ๊พธ๊ณ ํ์ค์ ์ฝ๋๋ก ํฉ์นฉ๋๋ค.
function solution(participant, completion) {
completion.map((name) => (completion[name] = (completion[name] | 0) + 1));
return participant.find((name) => !completion[name]--, completion);
}
solution = (participant, completion) =>
participant.find(
(name) => !completion[name]--,
completion.map((name) => (completion[name] = (completion[name] | 0) + 1))
);
๋ง์ง๋ง์ผ๋ก ๊ฐ๋ ์ฑ์ ํฌ๊ธฐํ๊ณ ๋ชจ๋ ์ด๋ฆ์ ํ๊ธ์๋ก ์์ ํ๋ฉด ์๋์ ๊ฐ์ด ์์ฝ๋ฉ ์ฝ๋๊ฐ ์์ฑ๋ฉ๋๋ค.
solution=(p,c)=>p.find(n=>!c[n]--,c.map(n=>(c[n]=(c[n]|0)+1)))