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

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

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Lv.2] ์ˆซ์ž์˜ ํ‘œํ˜„

ํ’€์ด ๋‚ ์งœ : 2025.04.21
๋ฌธ์ œ ์œ ํ˜• : ์—ฐ์Šต๋ฌธ์ œ
๋ฌธ์ œ ์ œ๋ชฉ : ์ˆซ์ž์˜ ํ‘œํ˜„
๋ฌธ์ œ ๋งํฌ : https://school.programmers.co.kr/learn/courses/30/lessons/12924

 

Intuition

  • ์ž์—ฐ์ˆ˜ n์„ ์—ฐ์†๋œ ์ž์—ฐ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด n์ด 15๋ผ๋ฉด, 1+2+3+4+5, 4+5+6, 7+8, 15 ์˜ ๋„ค ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
  • n/2๋ณด๋‹ค ํฐ ์ž์—ฐ์ˆ˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ž์—ฐ์ˆ˜์˜ ํ•ฉ์€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ž์—ฐ์ˆ˜์˜ ํ•ฉ์€ n/2 ๋ณด๋‹ค ์ž‘์€ ์ˆ˜๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ ์„ ๊ณ ๋ คํ•œ๋‹ค.
  • n ์ž์ฒด๋กœ๋งŒ ํ‘œํ˜„๋˜๋Š” ์—ฃ์ง€์ผ€์ด์Šค ํ•œ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

 

Approach

  • ์—ฐ์†๋œ ์ž์—ฐ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜ answer๋ฅผ ์„ ์–ธํ•œ๋‹ค.
    • ์ž๊ธฐ ์ž์‹ ์€ ๋ฌด์กฐ๊ฑด ํฌํ•จ๋˜๋ฏ€๋กœ 1๋กœ ์„ ์–ธํ•œ๋‹ค.
  • for ๋ฃจํ”„
    • 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ n/2 ๋ณด๋‹ค ์ž‘์€ ์ž์—ฐ์ˆ˜๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
    • ์ž์—ฐ์ˆ˜์˜ ํ•ฉ์„ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜ sum, ์ž์—ฐ์ˆ˜ ํ•ฉ์˜ ์‹œ์ž‘ํ•˜๋Š” ๋ณ€์ˆ˜ start๋ฅผ ์„ ์–ธํ•œ๋‹ค.
  • while ๋ฃจํ”„
    • sum์— start๋ฅผ ๋ˆ„์ ํ•˜๊ณ  ๋ฐ˜๋ณตํ•  ๋•Œ๋งˆ๋‹ค start๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
    • sum์ด n๋ณด๋‹ค ์ž‘์„ ๋•Œ๊นŒ์ง€๋งŒ ๋ฐ˜๋ณตํ•œ๋‹ค.
    • sum์ด n๊ณผ ๊ฐ™์•„์กŒ๋‹ค๋ฉด answer๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  • answer๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

Complexity

  • Time complexity : O(n²)
    • for ๋ฃจํ”„์—์„œ n/2๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฏ€๋กœ O(n), while ๋ฌธ์—์„œ๋„ ์ตœ์•…์˜ ๊ฒฝ์šฐ nํšŒ์— ๊ฐ€๊น๊ฒŒ(์‹ค์ œ๋กœ๋Š” n๋ณด๋‹ค ์ž‘์ง€๋งŒ) ๋ฐ˜๋ณตํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๋žต์ ์œผ๋กœ O(n²) ์œผ๋กœ ๋ณด์ธ๋‹ค.
  • Space complexity : O(1)
    • ๋ณ„๋„์˜ ๋ฐฐ์—ด์ด๋‚˜ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ O(1)์ด๋‹ค.

 

Code

function solution(n) {
    let answer = 1;
    
    for (let i = 1; i < n/2; i++) {
        let sum = 0;
        let start = i;
        
        while (sum < n) {
            sum += start
            start += 1;
        }
        
        if (sum === n) {
            answer += 1;
        }
    }
    
    return answer;
}

 

๋‹ค๋ฅธ ๋ฐฉ์‹์˜ ์ฝ”๋“œ : ํˆฌ ํฌ์ธํ„ฐ or ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๋ฐฉ์‹

  • start, end๋Š” ์—ฐ์†๋œ ์ž์—ฐ์ˆ˜ ๊ตฌ๊ฐ„์˜ ์‹œ์ž‘๊ณผ ๋์„ ์˜๋ฏธํ•˜๊ณ , 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. sum์€ ๊ทธ ๊ตฌ๊ฐ„์˜ ํ•ฉ์ด๋‹ค.
    ํ•ฉ์ด n๋ณด๋‹ค ์ž‘์œผ๋ฉด end๋ฅผ ๋Š˜๋ ค์„œ sum์— ๋”ํ•œ๋‹ค.
    ํ•ฉ์ด n๋ณด๋‹ค ํฌ๋ฉด start๋ฅผ ์ค„์—ฌ์„œ sum์— ๋”ํ•œ๋‹ค.
    ํ•ฉ์ด n๊ณผ ์ผ์น˜ํ•˜๋ฉด ์ด๋ฅผ ์นด์šดํŠธํ•˜๊ณ  ๋‹ค์Œ ๊ตฌ๊ฐ„(start + 1)๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
    ์ž๊ธฐ ์ž์‹ ์ด ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํฌํ•จํ•˜์—ฌ ์ •๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • start, end๋Š” ๋‘ ๊ฐœ์˜ ํฌ์ธํ„ฐ๊ฐ€ ๋˜์–ด ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ธ๋‹ค. 
    ๊ฐ๊ฐ ์ตœ๋Œ€ nํšŒ ์ด๋™ํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด ๋˜์–ด ๋” ํšจ์œจ์ ์ธ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.
function solution(n) {
    let answer = 0;
    let start = 1, end = 1, sum = 1;

    while (start <= n / 2) {
        if (sum === n) {
            answer++;
            sum -= start;
            start++;
        } else if (sum < n) {
            end++;
            sum += end;
        } else {
            sum -= start;
            start++;
        }
    }

    return answer + 1;
}