Skip to content

๐Ÿธ FrogRiverOne ๋ฌธ์ œ ํ•ด๊ฒฐ (Codility) โ€‹

๐Ÿ“Œ ๋ฌธ์ œ ์„ค๋ช… โ€‹

๊ฐœ๊ตฌ๋ฆฌ๋Š” ์œ„์น˜ 0์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋ชฉํ‘œ ์œ„์น˜ X๋กœ ์ ํ”„ํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ• ์œ„์— N๊ฐœ์˜ ๋‚˜๋ญ‡์žŽ์ด ๋–จ์–ด์ง€๋ฉฐ, ๋ฐฐ์—ด A์˜ ์ธ๋ฑ์Šค๋Š” ์‹œ๊ฐ„(time) ์„ ๋‚˜ํƒ€๋‚ด๊ณ , ๊ฐ’์€ ๋‚˜๋ญ‡์žŽ์ด ๋–จ์–ด์ง„ ์œ„์น˜(position) ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๊ตฌ๋ฆฌ๊ฐ€ ์œ„์น˜ X๊นŒ์ง€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ์ฐพ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ฑด๋„ ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น ์ž…๋ ฅ โ€‹

  • ์ •์ˆ˜ X (๋ชฉํ‘œ ์œ„์น˜)
  • ๋ฐฐ์—ด A (๊ฐ ์‹œ๊ฐ„ t์— A[t] ์œ„์น˜์— ๋‚˜๋ญ‡์žŽ์ด ๋–จ์–ด์ง)

๐Ÿ”น ์ถœ๋ ฅ โ€‹

  • ๊ฐœ๊ตฌ๋ฆฌ๊ฐ€ X๊นŒ์ง€ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„
  • ๋งŒ์•ฝ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋ฉด -1 ๋ฐ˜ํ™˜

๐Ÿ“ ์˜ˆ์ œ ๋ถ„์„ โ€‹

typescript
X = 5
A = [1, 3, 1, 4, 2, 3, 5, 4]

๐Ÿ”น ๋ฐฐ์—ด ํ•ด์„ โ€‹

  • ์‹œ๊ฐ„ 0: ์œ„์น˜ 1์— ์žŽ์ด ๋–จ์–ด์ง โœ…
  • ์‹œ๊ฐ„ 1: ์œ„์น˜ 3์— ์žŽ์ด ๋–จ์–ด์ง โœ…
  • ์‹œ๊ฐ„ 2: ์œ„์น˜ 1์— ๋˜ ์žŽ์ด ๋–จ์–ด์ง (์ด๋ฏธ ์žˆ์Œ)
  • ์‹œ๊ฐ„ 3: ์œ„์น˜ 4์— ์žŽ์ด ๋–จ์–ด์ง โœ…
  • ์‹œ๊ฐ„ 4: ์œ„์น˜ 2์— ์žŽ์ด ๋–จ์–ด์ง โœ…
  • ์‹œ๊ฐ„ 5: ์œ„์น˜ 3์— ๋˜ ์žŽ์ด ๋–จ์–ด์ง (์ด๋ฏธ ์žˆ์Œ)
  • ์‹œ๊ฐ„ 6: ์œ„์น˜ 5์— ์žŽ์ด ๋–จ์–ด์ง โœ… (๋ชจ๋“  1~5๊ฐ€ ์ฑ„์›Œ์ง)

๐Ÿ”น ๊ฒฐ๊ณผ โ€‹

๊ฐœ๊ตฌ๋ฆฌ๋Š” ์‹œ๊ฐ„ 6์— ๋ชจ๋“  ์žŽ์ด ์ฑ„์›Œ์ ธ์„œ X=5๊นŒ์ง€ ์ ํ”„ ๊ฐ€๋Šฅ!
๐Ÿ‘‰ ์ตœ์†Œ ์‹œ๊ฐ„์€ 6!


๐Ÿšจ ์ด์ „ ์ฝ”๋“œ (๋น„ํšจ์œจ์ ์ธ O(N * X)) โ€‹

typescript
function solution(X: number, A: number[]): number {
  const leaves = Array(X + 1).fill(false)
  leaves[0] = true

  const isFull = () => leaves.every(Boolean)
  let leafIdx = 0
  while (leafIdx < A.length) {
    leaves[A[leafIdx]] = true
    if (isFull()) break
    leafIdx++
  }
  return leafIdx
}

๐Ÿš€ ๊ฐœ์„ ๋œ ์ฝ”๋“œ ๊ตฌํ˜„ (O(N)) โ€‹

typescript
function solution(X: number, A: number[]): number {
  const leaves = new Set<number>() // ๊ฐœ๊ตฌ๋ฆฌ๊ฐ€ ๋ฐŸ์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜ ์ €์žฅ

  for (let time = 0; time < A.length; time++) {
    leaves.add(A[time]) // ์ƒˆ๋กœ์šด ์žŽ ์œ„์น˜ ์ถ”๊ฐ€
    if (leaves.size === X) return time // X๊ฐœ ์œ„์น˜๊ฐ€ ๋ชจ๋‘ ๋“ฑ์žฅํ–ˆ์œผ๋ฉด ๋ฐ˜ํ™˜
  }

  return -1 // ๋๊นŒ์ง€ ๋‹ค ํ™•์ธํ–ˆ๋Š”๋ฐ X์— ๋„๋‹ฌ ๋ถˆ๊ฐ€๋Šฅ
}

๐Ÿ’ก ๊ฐœ์„  ์ด์œ  โ€‹

โŒ ์ด์ „ ์ฝ”๋“œ ๋ฌธ์ œ์  โ€‹

  1. isFull() ํ•จ์ˆ˜ (leaves.every(Boolean))์˜ O(X) ๋น„ํšจ์œจ์„ฑ

    • while ๋ฃจํ”„ ๋‚ด์—์„œ O(X)์˜ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณต ์ˆ˜ํ–‰ํ•˜์—ฌ O(N * X) ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ฐœ์ƒ
  2. leaves[0] = true ๋ถˆํ•„์š”ํ•œ ์ž‘์—…

    • ๊ฐœ๊ตฌ๋ฆฌ๋Š” 1~X๋งŒ ํ•„์š”ํ•˜๋ฏ€๋กœ 0๋ฒˆ ์ธ๋ฑ์Šค๋Š” ๋ถˆํ•„์š”ํ•œ ๊ณต๊ฐ„ ๋‚ญ๋น„
  3. ๋ฐ˜๋ณต๋ฌธ ์„ค๊ณ„ ๋น„ํšจ์œจ

    • while ๋Œ€์‹  for ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ํƒˆ์ถœํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ 

โœ… ๊ฐœ์„ ๋œ ์ฝ”๋“œ ์žฅ์  โ€‹

  1. Set์„ ์‚ฌ์šฉํ•˜์—ฌ O(N)์œผ๋กœ ํ•ด๊ฒฐ ๐Ÿš€
  2. ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ๋งค๋ฒˆ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  Set.size === X๋ฅผ ๋งŒ์กฑํ•˜๋ฉด ์ฆ‰์‹œ ์ข…๋ฃŒ
  3. ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ตœ์†Œํ™”

๐Ÿ›  ์˜ˆ์ œ ํ…Œ์ŠคํŠธ โ€‹

typescript
console.log(solution(5, [1, 3, 1, 4, 2, 3, 5, 4])) // ์ถœ๋ ฅ: 6
console.log(solution(5, [1, 3, 1, 4, 2, 3])) // ์ถœ๋ ฅ: -1 (5๊ฐ€ ์—†์Œ)
console.log(solution(2, [2, 2, 2, 2, 2, 2])) // ์ถœ๋ ฅ: -1 (1์ด ์—†์Œ)
console.log(solution(1, [1])) // ์ถœ๋ ฅ: 0 (๋ฐ”๋กœ ๊ฑด๋„ ์ˆ˜ ์žˆ์Œ)

๐Ÿ“Œ ๊ฒฐ๋ก  โ€‹

โœ… ์ตœ์ ํ™”๋œ O(N) ํ’€์ด๋กœ Codility 100% ํ†ต๊ณผ ๊ฐ€๋Šฅ! ๐Ÿš€
โœ… Set์„ ํ™œ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ ์ตœ์†Œํ™”!
โœ… ๊ฐ€๋Šฅํ•œ ๋น ๋ฅด๊ฒŒ ๊ฐœ๊ตฌ๋ฆฌ๊ฐ€ ๊ฑด๋„ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ์ฐพ๊ณ  ์ฆ‰์‹œ ๋ฐ˜ํ™˜! ๐ŸŽฏ

์ด์ œ ๊ฐœ๊ตฌ๋ฆฌ๊ฐ€ ๊ฐ•์„ ๊ฑด๋„ˆ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๐Ÿธโœจ