λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Problem solving/Programmers

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 문제 풀이 : 숫자의 ν‘œν˜„ (C++)

by DONXUX 2023. 6. 16.

https://school.programmers.co.kr/learn/courses/30/lessons/12924

πŸ—’οΈ 문제 

레벨 : 2

Finn은 μš”μ¦˜ μˆ˜ν•™κ³΅λΆ€μ— λΉ μ Έ μžˆμŠ΅λ‹ˆλ‹€. μˆ˜ν•™ 곡뢀λ₯Ό ν•˜λ˜ Finn은 μžμ—°μˆ˜ n을 μ—°μ†ν•œ μžμ—°μˆ˜λ“€λ‘œ ν‘œν˜„ ν•˜λŠ” 방법이 μ—¬λŸ¬κ°œλΌλŠ” 사싀을 μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 예λ₯Όλ“€μ–΄ 15λŠ” λ‹€μŒκ³Ό 같이 4κ°€μ§€λ‘œ ν‘œν˜„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • 1 + 2 + 3 + 4 + 5 = 15
  • 4 + 5 + 6 = 15
  • 7 + 8 = 15
  • 15 = 15

μžμ—°μˆ˜ n이 λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μ—°μ†λœ μžμ—°μˆ˜λ“€λ‘œ n을 ν‘œν˜„ν•˜λŠ” λ°©λ²•μ˜ 수λ₯Ό returnν•˜λŠ” solutionλ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.
 
μ œν•œμ‚¬ν•­

  • n은 10,000 μ΄ν•˜μ˜ μžμ—°μˆ˜ μž…λ‹ˆλ‹€.

✍️ 풀이

μ—°μ†λœ μžμ—°μˆ˜λ“€μ˜ 합은 λ‹€μŒκ³Ό 같이 μΌλ°˜ν™” ν•  수 μžˆμŠ΅λ‹ˆλ‹€. n은 μž„μ˜μ˜ xλΆ€ν„° x + mκΉŒμ§€ 1 μ¦κ°€ν•˜λŠ” μ—°μ†λœ 수의 합을 μ˜λ―Έν•˜μ£ .

즉, 이 λ¬Έμ œλŠ” μœ„ μ‹μ—μ„œ n이 λ˜λŠ”, xκ°€ 0이 μ•„λ‹Œ, μ–‘μ˜ μ •μˆ˜ (x, m)쌍의 개수λ₯Ό κ΅¬ν•˜λŠ” 문제둜 μΉ˜ν™˜λ  수 μžˆμŠ΅λ‹ˆλ‹€.

  • m은 0을 κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. m = 0인 상황은 μ—°μ†λœ ν‘œν˜„μ΄ μžκΈ°μžμ‹ μΌ λ•Œ μž…λ‹ˆλ‹€. (예 : 15 = 15)
  • xλŠ” 0이 될 수 μ—†μŠ΅λ‹ˆλ‹€. n은 μ—°μ†λœ μžμ—°μˆ˜λ“€μ˜ 합이어야 ν•˜κΈ° λ•Œλ¬Έμ— 0λΆ€ν„° μ‹œμž‘ν•  수 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ 두 가지 μ „λž΅ 쀑 ν•˜λ‚˜λ₯Ό 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • x에 1λΆ€ν„° 값을 λŒ€μž…ν•΄λ³΄λ©΄μ„œ m이 μ–‘μ˜ μ •μˆ˜μΈμ§€ κ²€μ‚¬ν•˜κΈ°
  • m에 0λΆ€ν„° 값을 λŒ€μž…ν•΄λ³΄λ©΄μ„œ xκ°€ μžμ—°μˆ˜μΈμ§€ κ²€μ‚¬ν•˜κΈ°

μ €λŠ” m에 값을 λŒ€μž…ν•΄λ³΄λ©΄μ„œ xκ°€ μžμ—°μˆ˜μΈμ§€ κ²€μ‚¬ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
μ—¬κΈ°μ„œ λ°”λ‘œ 2쀑 for문을 μ‚¬μš©ν•˜μ—¬ ν’€ 수 μžˆκ² μ§€λ§Œ, 식을 λ³΄μ•„ν•˜λ‹ˆ μ΅œμ ν™” ν•  수 μžˆλŠ” 뢀뢄이 μžˆμŠ΅λ‹ˆλ‹€.
 
μš°μ„  μœ„μ˜ 식을 μ•„λž˜μ™€ 같이 λ³€ν˜•ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ (1 + 2 + 3 + ... + m) 뢀뢄을 λ“±μ°¨μˆ˜μ—΄ ν•© κ³΅μ‹μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.

그리고 x에 λŒ€ν•œ μ‹μœΌλ‘œ λ°”κΏ”λ΄…μ‹œλ‹€.

μ΅œμ’…μ μœΌλ‘œ O(n)으둜 이 식을 μ΄μš©ν•΄μ„œ λ¬Έμ œμ—μ„œ 주어진 nκ³Ό ν•¨κ»˜, m을 0λΆ€ν„° nκΉŒμ§€ λŒ€μž…ν•΄λ³΄λ©΄μ„œ xκ°€ μžμ—°μˆ˜κ°€ 되면 μΉ΄μš΄νŒ…ν•˜λ©΄ λ©λ‹ˆλ‹€!🀣
 
μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

#include <string>
#include <vector>

using namespace std;

int solution(int n) {
    int answer = 0;
    
    for (double m = 0; m <= n; ++m) {
        double x = (((double)n * 2) - (m * (m + 1))) / (2 * (m + 1)); 
        if (x > 0 && x - (int) x == 0) answer++; // xλŠ” μžμ—°μˆ˜μΈκ°€?
        else if (x < 1) break;	// xκ°€ 1 미만이 되면 진행할 ν•„μš”μ—†μŒ
    }
    
    return answer;
}