๐ฉ๐ป๐ป๋ฌธ์ ๋งํฌ
[ํ๋ก๊ทธ๋๋จธ์ค 42576] ์์ฃผํ์ง ๋ชปํ ์ ์ (Javascript)
๋ฌธ์ ์ค๋ช
์๋ง์ ๋ง๋ผํค ์ ์๋ค์ด ๋ง๋ผํค์ ์ฐธ์ฌํ์์ต๋๋ค. ๋จ ํ ๋ช
์ ์ ์๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ์ ์๊ฐ ๋ง๋ผํค์ ์์ฃผํ์์ต๋๋ค.
๋ง๋ผํค์ ์ฐธ์ฌํ ์ ์๋ค์ ์ด๋ฆ์ด ๋ด๊ธด ๋ฐฐ์ด 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"๋ ์ฐธ์ฌ์ ๋ช
๋จ์๋ ๋ ๋ช
์ด ์์ง๋ง, ์์ฃผ์ ๋ช
๋จ์๋ ํ ๋ช
๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ํ๋ช
์ ์์ฃผํ์ง ๋ชปํ์ต๋๋ค.
โ๏ธIdea Sketch
2021-06-18
1. ์์ฃผํ์ง ๋ชปํ ์ ์์ ์ด๋ฆ์ return ํ๋ค
2. (์ฃผ์) ๋๋ช ์ด์ธ์ด ์์ ์ ์๋ค --> arr.filter ์ธ ์ ์๋?
- completion์ ์ค๋ณต์๋ ๋ฐฐ์ด์ธ Set ์ผ๋ก ๋ณํ
- ์์ฃผ์ ๋ช ๋จ์ ์๋ ๊ฒฝ์ฐ, ์์ฃผ์ Set ์์ ์ ๊ฑฐํ๋ฉด ๋๋ค.
participant.filter(p => {
if (!s.has(p)) return p;
else s.delete(p);
}
3. ๋จ ํ ๋ช ์ ์ ์๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ์ ์๊ฐ ๋ง๋ผํค์ ์์ฃผ
- ๋จ ํ ๋ช ์ ์ ์๋ฅผ ์ฐพ์ผ๋ฉด ์ฐ์ฐ์ ์ข ๋ฃํ๊ณ ์ถ์
- arr.filter()๋ ๋ฐฐ์ด ๋๊น์ง ํ์ธํ๋ฏ๋ก ํจ์จ์ฑ์ด ๋ฎ์ง ์์๊น?
- arr.map(), arr.filter(), arr.reduce()๋ ๋๊น์ง ํ์ธํจ --> arr.forEach()๋ฅผ ์จ๋ณผ๊น?
๋ฌธ์ ์ : arr.forEach()์ ํน์ง
return true; // continue
return false; // continue
return something; // undefined
2021-06-23
1. ํจ์จ์ฑ ํต๊ณผ๋ฅผ ์ํด completion ๋ฐฐ์ด์ ์์ ์ญ์ ์์ด ๊ตฌํ๋ฐฉ๋ฒ ๊ณ ์
2. sort() ์ฌ์ฉ ํ ์ฒ์๋ถํฐ ๋๊น์ง ์ผ์น/๋ถ์ผ์น ํ์ธ
- ๋ฐฐ์ด์ ์ฒ์๋ถํฐ ๋๊น์ง ํ์ธํ๋ฏ๋ก ํจ์จ์ฑ ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ด๋ผ ์์ธก
์คํ๊ฒฐ๊ณผ, ์์๊ณผ ๋ฌ๋ฆฌ ํจ์จ์ฑ ํต๊ณผ
โ๏ธ์์ค์ฝ๋
2021-06-18 ์ ํ์ฑ 2๊ฐ ์คํจ, ํจ์จ์ฑ ์คํจ
function solution(participant, completion) {
let s = new Set(completion);
return participant.filter((p) => {
if (!s.has(p)) return p;
else s.delete(p);
})[0];
}
2021-06-23 ์ ํ์ฑ ์ฑ๊ณต, ํจ์จ์ฑ ์ฑ๊ณต
function solution(participant, completion) {
participant = participant.sort();
completion = completion.sort();
for (let i = 0; i < participant.length; i++) {
if (participant[i] !== completion[i]) return participant[i];
}
}
โ๏ธ๋ช ๋ต
๊ณ ์์ ์ฝ๋
var solution=(_,$)=>_.find(_=>!$[_]--,$.map(_=>$[_]=($[_]|0)+1))
- ๊ฐ๋ ์ฑ์ ์ํด ํ์ด์ด ์ฝ๋ (step 1)
var solution=(participant,completion)=>participant.find(name=>!completion[name]--,completion.map(name=>completion[name]=(completion[name]|0)+1)) // 1
- ๊ฐ๋ ์ฑ์ ์ํด ํ์ด์ด ์ฝ๋ (step 2)
var solution = (participant, completion) => {
completion.map((name) => (completion[name] = (completion[name] | 0) + 1)); // 2
return participant.find((name) => !completion[name]--); // 4
};
๋๊ธ ์ธ์ฉํ ์ค๋ช
1. participant.find(์ฝ๋ฐฑ ์ ๋ก์ฐ ํจ์, ๋งตํ์ )์์ ๋งตํ์ ์ด ๋จผ์ ์คํ๋๋ ์ด์
- participant.find(์ฝ๋ฐฑ ์ ๋ก์ฐ ํจ์, ๋งตํ์ ) ์ด๋ ๊ฒ ๋๊ฐ์ argument(์ ๋ฌ์ธ์)๊ฐ ์ฃผ์ด์ง๊ฑฐ๊ณ , ๋ค์ ๋งตํ์ ์ด ์ฝ๋ฐฑ ์ ์ ์คํ์ด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํจ์๊ฐ ์์์ด ๋๋ฉด ์ฝ๋ฐฑ ์ ๋ก์ฐ ํจ์ ๋ณด๋ค ๋๋ฒ์งธ ๋งต ํจ์๊ฐ ๋จผ์ ์คํ์ด ๋ฉ๋๋ค.
2. completion[name]=(completion[name]|0)+1) ์๋ฏธ
- completion[name]์ ์ ์๋ฅผ ํ๋๋ฐ (=), ๋ญ๋ก ๋ง๋๋๋ฉด, OR ์ ์ฌ์ฉํด์, "๋ง์ฝ completion[name]์ด ์กด์ฌํ๋ฉด, ๊ทธ ๊ฐ์ +1 ์ ํ ๊ฒ", ์ด๊ณ , "์กด์ฌ ์ํ๋ฉด, 0 + 1 (์ฆ 1์ด์ฃ )"์ผ๋ก ์ ์ํด๋ผ.
3. ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐฐ์ด์ ์ฌ์ค, ๊ฐ์ฒด์ ๋๋ค.
- typeof ๋ก ์๋ฌด ๋ฐฐ์ด ๋ง๋์ ์ ํ์ธํด๋ณด์๋ฉด ์ค๋ธ์ ํธ๊ฐ ๋์ค์ฃ . ๊ทธ๋ฌ๋ฏ๋ก completion[name]์ ํ๋ฉด ๋จ์ํ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ฒด์์ 'key-value' ํ์ด์์ ๋ฐธ๋ฅ ์ ๊ทผํ๋ฏ์ด "completion ๊ฐ์ฒด ์ค name์ด๋ผ๋ ํค์ ๊ฐ์ด ๋ญ๋" ๊ฐ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ฝ์ ๊ทธ๋ฐ ํค-๋ฐธ๋ฅ ํ์ด๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด undefined๋ฅผ ๋ฆฌํดํ๊ฒ ๋๊ณ , ์ด๊ฒ์ false๊ฐ ๋๋ฏ๋ก, ์์ OR ๊ตฌ์ ์์ ์์ด false์์ผ๋ฏ๋ก ๋ค์ ๊ฐ์ธ 0 ์ด ์ถ๋ํ๊ฒ ๋๊ณ , ์ค์ ๋ก ์ ์๋๋ ๊ฐ์ 0 + 1์ธ 1 ์ด๋์ฃ . ๊ทธ๋ฌ๋ฏ๋ก ์ปดํ๋ฆฌ์ ๋ฐฐ์ด ์์ "ํ๋๋ง ์๋ ์ด๋ฆ"์ ๋ชจ๋ ์ด๋ฆ : 1 ์ด๋ ๊ฒ ๋ณํ๊ฒ ๋ฉ๋๋ค.
- ๋ง์ฝ์ ์ด๋ฆ์ด ๋๊ฐ์ธ ๊ฒฝ์ฐ์๋ completion[name]์ด ์ด๋ฏธ ์กด์ฌํด์ 1 ์ด๋ผ๋ ๊ฐ์ ๋ฆฌํด ํ ๊ฑฐ๊ณ , ๊ทธ๋ฌ๋ฉด 1 + 1 ์ด๋์ด์ 2๊ฐ๊ฐ ๋๊ณ , ์ด๋ฆ์ด ๋ ๋ง์ผ๋ฉด ๋ญ ๊ณ์ ๋ํด์ง๊ฒ ์ฃ . completion ๋ฐฐ์ด์ ๊ฐ ์์์ ๋ํด ์ด ์์ ์ ๋๋ด์ฃผ๋ฉด ์ด '๋งตํ์ ' ๋ถ๋ถ์ ์กด์ฌ ์ด์ ๊ฐ ๋ฌ์ฑ์ด ๋๊ณ completion์ ์ฒ์์ ์ธํ ๋ฐ์๋ ๋ฐฐ์ด์ด ์๋, ์ด๋ฆ: ๊ฐฏ์ ๋ค์ด "์ถ๊ฐ๊ฐ ๋" ๋ฐฐ์ด์ด ๋์ฃ . ์ค์ ๋ก ๋ฐ๋ ๋ฐฐ์ด์ ์ฒดํฌํด๋ณด๋ฉด ์ด๋ ์ต๋๋ค. ['cake', 'ball', 'sauce', 'cake', cake: 2, ball: 1, sauce: 1].
4. !completion[name]-- ์๋ฏธ
- participant์ find๋ฅผ ํ์ผ๋ฏ๋ก ์ด์ ๋ชจ๋ ์ฐธ๊ฐ์์ ์ด๋ฆ์ ๊ฐ๊ณ completion์ ์ด ์ด๋ฆ์ด ๋ช ๊ฐ ์กด์ฌ ํ์๋๋ฅผ ๋ณด๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ง์ฝ์ ์ด๋ฆ์ด 1๊ฐ ์์ผ๋ฉด "๋ถ๋ ค์ค๋ ์๊ฐ์๋ 1์ด๋ฏ๋ก ์ด๊ฒ์ ๋ถ๋ฆฌ์ธ์ผ๋ก ๋ณด๋ฉด ์ฐธ", ๊ทธ๋ฆฌ๊ณ find์ ์ฐธ๊ฑฐ์ง ํ๋ณ์ ์์ ! ๋๋ํ๋ก ์ธํด ์ฐธ์ ๊ฑฐ์ง์ผ๋ก ๋ณํด์ '๊ฑฐ์ง'์ด ๋ฉ๋๋ค. 1 ์ด์์ด์์ด๋ ๋ง์ฐฌ๊ฐ์ง๋ก 0์ด์์ ์ซ์์์๊ฑฐ๋๊น, ๊ฑฐ์ง์ผ๋ก ํ๋ช ์ด ๋๊ณ find ํจ์๋ ๊ณ์ ์ด์ด์ง๋๋ค. ๊ทธ๋ฌ๋ฉด ์ธ์ "์ฐธ"์ด ๋์ค๋๋ฉด, ๊ทธ๊ฒ์ completion[name]์ด '๊ฑฐ์ง'์ด ๋๋ ๊ฐ์ ๋ฐํํ์ ๋ ๋ฟ์ ๋๋ค.
- ๊ฑฐ์ง์ด ๋ ๊ฐ์ 0 ์ด๊ฑฐ๋, ์๋๋ฉด 'name'์ ํด๋นํ๋ ํ์ด๊ฐ completion์ ์กด์ฌํ์ง ์์ ๋๋ undefined๋ฅผ ๋ฆฌํด ํ๊ฒ ์ฃ . ๊ทธ๋ผ false๋ค์ ๋ฆฌํดํ๊ฒ ๋๊ณ , ! ๋ก ์ธํด์ true๋ก ๋ฐ๋๊ณ ์ ๋ต ๊ฐ๋ด๋ฐ๋ ์ ๋๋ค.
๋์๋๋ ๋๊ธ ํ๋ง๋
1. ๋ฐฐ์ด์ ๋ํด์๋ for … in ๊ตฌ๋ฌธ ๋ณด๋ค๋ for๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ES6์ forEach ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
- for … in์ ๊ฐ์ฒด ๋ด์ ํ๋กํผํฐ ์์ฑ ์ค enumerable: true์ธ ๋ชจ๋ ํ๋กํผํฐ๋ฅผ ์ํํ์ฌ ๊ฒ์ํ๋ ์ฉ๋์ด๊ธฐ ๋๋ฌธ์ ์ ํฉํ์ง ์์ต๋๋ค.
- ์ต๊ทผ์ ๋ธ๋ผ์ฐ์ ๋ ๋ฐฐ์ด์ ๋ํด for … in์ ์ฌ์ฉํด๋ ์ค๋ฅ๊ฐ ๋์ง ์์ง๋ง, Old IE์ ๊ฒฝ์ฐ์๋ ๋ฐฐ์ด ์ธ๋ฑ์ค ์ธ์ ๊ฒ์ถ๋๋ ํ๋กํผํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ undefined ์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.