πŸ… ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 42576 : μ™„μ£Όν•˜μ§€ λͺ»ν•œ μ„ μˆ˜ - Javascript

μ•Œκ³ λ¦¬μ¦˜ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

문제 μ„€λͺ…

μˆ˜λ§Žμ€ λ§ˆλΌν†€ μ„ μˆ˜λ“€μ΄ λ§ˆλΌν†€μ— μ°Έμ—¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 단 ν•œ λͺ…μ˜ μ„ μˆ˜λ₯Ό μ œμ™Έν•˜κ³ λŠ” λͺ¨λ“  μ„ μˆ˜κ°€ λ§ˆλΌν†€μ„ μ™„μ£Όν•˜μ˜€μŠ΅λ‹ˆλ‹€.

λ§ˆλΌν†€μ— μ°Έμ—¬ν•œ μ„ μˆ˜λ“€μ˜ 이름이 λ‹΄κΈ΄ λ°°μ—΄ participant와 μ™„μ£Όν•œ μ„ μˆ˜λ“€μ˜ 이름이 λ‹΄κΈ΄ λ°°μ—΄ completion이 μ£Όμ–΄μ§ˆ λ•Œ, μ™„μ£Όν•˜μ§€ λͺ»ν•œ μ„ μˆ˜μ˜ 이름을 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­

  • λ§ˆλΌν†€ 경기에 μ°Έμ—¬ν•œ μ„ μˆ˜μ˜ μˆ˜λŠ” 1λͺ… 이상 100,000λͺ… μ΄ν•˜μž…λ‹ˆλ‹€.
  • completion의 κΈΈμ΄λŠ” participant의 길이보닀 1 μž‘μŠ΅λ‹ˆλ‹€.
  • μ°Έκ°€μžμ˜ 이름은 1개 이상 20개 μ΄ν•˜μ˜ μ•ŒνŒŒλ²³ μ†Œλ¬Έμžλ‘œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.
  • μ°Έκ°€μž μ€‘μ—λŠ” 동λͺ…이인이 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

participantcompletionreturn
["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;
}

:::help counts에 name이 없을 μˆ˜λ„ μžˆλŠ”λ° !counts[name]--이 μ™œ μ œλŒ€λ‘œ μž‘λ™ν•˜λ‚˜μš”?

  1. counts[name]κ°€ λΉ„μ–΄μžˆμ„ 경우 μ ‘κ·Όν•˜λ©΄ undefinedλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  2. undefinedκ°€ μ‚°μˆ  μ—°μ‚°μžμ™€ λ§Œλ‚˜λ©΄ 였λ₯˜ 없이 NaN으둜 λ°”λ€Œκ²Œ λ©λ‹ˆλ‹€.
  3. 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;
}

:::help 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)))