๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œํ’€์ด/Programmers - Lv.2

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv.2] ์˜์–ด ๋๋ง์ž‡๊ธฐ

ํ’€์ด ๋‚ ์งœ : 2025.05.08
๋ฌธ์ œ ์œ ํ˜• : Summer/Winter Coding(~2018)
๋ฌธ์ œ ์ œ๋ชฉ : ์˜์–ด ๋๋ง์ž‡๊ธฐ
๋ฌธ์ œ ๋งํฌ : https://school.programmers.co.kr/learn/courses/30/lessons/12981

Intuition

  • ๋๋ง์ž‡๊ธฐ ๊ฒŒ์ž„์—์„œ ๊ทœ์น™์„ ์–ด๊ธด ์ฒซ ๋ฒˆ์งธ ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ์™€ ์ฐจ๋ก€๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค. ๊ทœ์น™ ์œ„๋ฐ˜์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
    • ์ค‘๋ณต๋œ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ
    • ์ด์ „ ์ฐจ๋ก€์—์„œ ๋งํ•œ ๋‹จ์–ด์˜ ๋งˆ์ง€๋ง‰ ๊ธ€์ž์™€ ํ˜„์žฌ ๋งํ•œ ๋‹จ์–ด์˜ ์ฒซ๊ธ€์ž๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ
  • ์ด์ „์˜ ์‚ฌ์šฉํ•œ ๋‹จ์–ด๋ฅผ ์–ด๋”˜๊ฐ€์— ์ €์žฅํ•˜๊ณ , ๋น ๋ฅด๊ฒŒ ํƒ์ƒ‰ํ•ด์•ผ ํ•œ๋‹ค.
    • ์ค‘๋ณต ๋‹จ์–ด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์ „์— ํ•จ์ˆ˜๊ฐ€ ๋๋‚  ๊ฒƒ์ด๋ฏ€๋กœ ๋ฐฐ์—ด๋ณด๋‹ค ํƒ์ƒ‰์ด ๋น ๋ฅธ Set์ด ์ ์ ˆํ•  ๊ฒƒ์ด๋‹ค.
  • ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•œ ์ฒซ ๋ฒˆ์งธ ์‚ฌ๋žŒ์˜ ๋ฒˆํ˜ธ์™€ ์ฐจ๋ก€๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค.
    • ํ˜„์žฌ ๋‹จ์–ด์˜ ์ˆœ์„œ๋ฅผ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ i๋ผ๊ณ  ํ•˜๊ณ , ์ธ์›์ด n๋ช…์ด๋ผ๊ณ  ํ•  ๋•Œ, ์•„๋ž˜์™€ ๊ฐ™์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
      ๋ฒˆํ˜ธ = i % n + 1
      ์ˆœ์„œ = Math.floor(i / n) + 1

Approach

  • ์ค‘๋ณต ๋‹จ์–ด๋ฅผ ์ €์žฅํ•  Set์„ ์„ ์–ธํ•œ๋‹ค.
  • ๋ฒˆํ˜ธ(num)์™€ ์ˆœ์„œ(turn)๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜๋ฅผ 0์œผ๋กœ ์„ ์–ธํ•œ๋‹ค. (ํƒˆ๋ฝ์ž๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š์œผ๋ฉด 0์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด)
  • set์— ์ฒซ ๋ฒˆ์งธ ๋‹จ์–ด๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • 1๋ฒˆ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ words๋ฅผ for ๋ฃจํ”„๋กœ ์ˆœํšŒํ•œ๋‹ค.
    • ๋‘ ๊ฐ€์ง€ ๊ทœ์น™์„ ํ•˜๋‚˜๋ผ๋„ ์œ„๋ฐ˜ํ–ˆ๋‹ค๋ฉด ๋ฒˆํ˜ธ์™€ ์ˆœ์„œ๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ  for ๋ฃจํ”„๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.
      • ์ค‘๋ณต๋œ ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ
      • ์ด์ „ ์ฐจ๋ก€์—์„œ ๋งํ•œ ๋‹จ์–ด์˜ ๋งˆ์ง€๋ง‰ ๊ธ€์ž์™€ ํ˜„์žฌ ๋งํ•œ ๋‹จ์–ด์˜ ์ฒซ๊ธ€์ž๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ
    • ๊ทœ์น™์„ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด set์— ๋‹จ์–ด๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • ๋ฒˆํ˜ธ์™€ ์ˆœ์„œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Complexity

  • Time complexity : O(w)
    • words์˜ ๊ธธ์ด๋ฅผ w๋ผ๊ณ  ํ•  ๋•Œ for ๋ฃจํ”„์—์„œ ์ตœ๋Œ€ words์˜ ๊ธธ์ด๋งŒํผ ์ˆœํšŒํ•˜๋ฏ€๋กœ O(w)์ด๋‹ค.
  • Splace complexity : O(w)
    • words์˜ ๊ธธ์ด๋ฅผ w๋ผ๊ณ  ํ•  ๋•Œ ๋‹จ์–ด์˜ ์ค‘๋ณต์ด ์—†๋‹ค๋ฉด Set์— ์ตœ๋Œ€ words์˜ ๊ธธ์ด๋งŒํผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ฐ ๋‹จ์–ด์˜ ๊ธธ์ด๊ฐ€ 2~50์ด๋ผ๋Š” ์กฐ๊ฑด์ด ์žˆ์œผ๋ฏ€๋กœ ์ด๋Š” ์ƒ์ˆ˜ ๋ฒ”์œ„๋กœ ์ทจ๊ธ‰ํ•˜๊ณ , ์ข…ํ•ฉ์ ์œผ๋กœ O(w)์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Code (JS)

function solution(n, words) {
    const set = new Set();
    let num = 0;
    let turn = 0;

    // ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ๋„ฃ๊ณ  ์‹œ์ž‘
    set.add(words[0]);

    for (let i = 1; i < words.length; i++) {        
        const isDuplicate = set.has(words[i]);
        const isWrong = words[i - 1].at(-1) !== words[i][0];

        if (isDuplicate || isWrong) {
            num = i % n + 1;
            turn = Math.floor(i / n) + 1;
            break;
        }

        set.add(words[i]);
    }

    return [num, turn];
}