코딩테스트/프로그래머스

숫자의 표현 C++ [프로그래머스]

멍토 2019. 11. 16.

안녕하세요 멍청한 토끼입니다.

이번 문제는 Lv2 카테고리에 있는

Lv2 숫자의 표현 문제 입니다.

 

※ 저의 풀이가 무조건적인 정답은 아닙니다.

다른 코드가 좀더 효율적이고 좋을 수 있습니다.

다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.

문제 주소입니다.

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

 

코딩테스트 연습 - 숫자의 표현 | 프로그래머스

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

programmers.co.kr

 


목차

1. 문제 설명

2. 문제 해석

3. 소스 코드

3.1 주석 없는 코드

3.2 주석 있는 코드

3.3 테스트 코드

4. 결과

 


1. 문제 설명

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 이하의 자연수 입니다.

 

예시

food_times return
15 4
42 4
8468 4
6335 8
6501 8
9170 8

 


2. 문제풀이

n이 15라고 하자


0. 1조합은 아래와 같이 계산해보세요.

1. 2개조합이라면, 1과 2를 더하고 n에서 빼준다.


2. 15-(1+2) =12 가 되고, 12를 조합개수인 2로 나눈다.


3. 12를 2로나누면 나머지가 0이므로 카운트를 증가시킨다.


검증 :
12를 2로나누면 몫은 6이고 위에서 사용했던 1과 2를 각각 더한다.
(6+1) + (6+2) = 7 + 8 =15

4. 3조합을 본다. 1,2,3을 더하고 n에서 빼준다.


5. 15-(1+2+3) = 9 가되고 9를 조합개수인 3으로 나눈다.


6. 9%3 은 0이되므로 카운트를 증가시킨다.


검증 :
9를 3으로 나누면 몫은 3이되고 위에서 사용한 1,2,3을 각각 더한다.
(3+1)+(3+2)+(3+3) = 4 + 5 + 6 = 15;

7. 4조합을 본다. 1,2,3,4를 더하고 n에서 빼준다.


8. 15-(1+2+3+4) = 5가 되고, 5를 조합개수인 4로 나눈다.


9. 5%4는 0이 아니므로 다음조합으로 넘어간다..



10. 5조합을 본다. 1,2,3,4,5를 더하고 n에서 빼준다.


11. 15-(1+2+3+4+5) = 0이 되고, 조합개수인 5로 나눈다.


12. 0%5는 0이므로 카운트를 증가시킨다.


검증 :
몫은 0이고 각각을 더해본다.
(0+1)+(0+2)+(0+3)+(0+4)+(0+5) = 1+2+3+4+5 = 15

13. 6조합부터는 합이 n보다 커지므로 계산하지 않는다.




3. 소스코드

3.1 주석없는 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <string>
#include <iostream>
 
using namespace std;
 
int solution(int n) {
    int answer = 0, nums = 1, sum = 0;
    while (true) {
        sum = 0;
        for (int i = 1; i <= nums; i++)    sum += i;
        if (sum > n)    break;
        if ((n - sum) % nums++ == 0)    answer++;
    }
    return answer;
}

3.2 주석있는 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <string>
#include <iostream>
 
using namespace std;
 
int solution(int n) {
    //정답개수, 더하는 개수, 합
    int answer = 0, nums = 1, sum = 0;
    while (true) {
        sum = 0;
        //2개 조합부터 찾아보기
        for (int i = 1; i <= nums; i++)    sum += i;
        //sum이 n보다 커진다면 반복문 탈출
        if (sum > n)    break;
        //n-sum이 더하는 개수로 나누어진다면 카운트 증가
        if ((n - sum) % nums++ == 0)    answer++;
    }
    //자기자신만 더하는 방법이 있으므로 1개추가
    return answer;
}

3.3 테스트 코드 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <string>
#include <iostream>
 
using namespace std;
 
int solution(int n) {
    //정답개수, 더하는 개수, 합
    int answer = 0, nums = 1, sum = 0;
    while (true) {
        sum = 0;
        //2개 조합부터 찾아보기
        for (int i = 1; i <= nums; i++)    sum += i;
        //sum이 n보다 커진다면 반복문 탈출
        if (sum > n)    break;
        //n-sum이 더하는 개수로 나누어진다면 카운트 증가
        if ((n - sum) % nums++ == 0)    answer++;
    }
    //자기자신만 더하는 방법이 있으므로 1개추가
    return answer;
}
 
void print(int n, int answer) {
    int t = solution(n);
    if (answer == t)
        cout << "정답" << endl;
    else
        cout << "틀림" << endl;
}
 
int main() {
    print(154);
    print(424);
    print(84684);
    print(63358);
    print(65018);
    print(91708);
    return 0;
}
 

4. 결과

댓글

💲 광고입니다.