์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์•Œ๊ณ ๋ฆฌ์ฆ˜

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 42576] ์™„์ฃผํ•˜์ง€ ๋ชปํ•œ ์„ ์ˆ˜ (Javascript)

์€์ง„ 2021. 6. 23. 11:24

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป๋ฌธ์ œ๋งํฌ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 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 ์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
2. arr.length ์‹์€ ๋งค๋ฒˆ ๋ฃจํ”„๋•Œ๋งˆ๋‹ค ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋‹ˆ length ์„ ์–ธํ•œ ๊ฐ’์„ ๋ณ€์ˆ˜๋กœ ๋บ€ ํ›„ ๊ทธ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์กฐ๊ธˆ ๋” ํ–ฅ์ƒํ•ฉ๋‹ˆ๋‹ค.