-
[프로그래머스 4단계] 알고리즘 33. 숫자의 표현24년 11월 이전/레거시-알고리즘(3) 2018. 4. 24. 10:26반응형
문제 출처는 프로그래머스 알고리즘 연습 에서 볼 수 있습니다!(https://programmers.co.kr/learn/challenges)
알고리즘 33. 숫자의 표현수학을 공부하던 민지는 재미있는 사실을 발견하였습니다. 그 사실은 바로 연속된 자연수의 합으로 어떤 숫자를 표현하는 방법이 여러 가지라는 것입니다. 예를 들어, 15를 표현하는 방법은(1+2+3+4+5)
(4+5+6)
(7+8)
(15)로 총 4가지가 존재합니다. 숫자를 입력받아 연속된 수로 표현하는 방법을 반환하는 expressions 함수를 만들어 민지를 도와주세요. 예를 들어 15가 입력된다면 4를 반환해 주면 됩니다.#include<iostream>using namespace std;int expressions(int testCase){int answer = 0;return answer;}int main(){int testNo = 15;int testAnswer = expressions(testNo);// 아래는 테스트로 출력해 보기 위한 코드입니다.cout<<testAnswer;}풀이:
이 문제는 생각보다 쉽게 풀 수 있다. 먼저 몇가지 예를 들어보면서 패턴을 분석해보자.
testCase = 15
1 + 2 + 3 + 4 + 5
4 + 5 + 6
7 + 8
15
testCase = 6
1 + 2 + 3
6
testCase = 7
3 + 4
7
testCase = 21
1 + 2 + 3 + 4 + 5 + 6
6 + 7 + 8
10 + 11
21
규칙을 찾았는가? 먼저 필자가 찾은 패턴은 다음과 같다.
- testCase 자기 자신
- 그 외에는 testCase / 2 + 1의 범위까지만 수를 검사한다.
무슨 말이냐면 21일 경우에는 자신의 반인 10과 그 뒤의 수 11을 더해져서 표현할 수 있다. 그러니까 연속적으로 더해서 수를 표현할 수 있는 범위는 testCase/2 + 1까지라는 소리다. 즉, 1부터 testCase/2 + 1(이하 range)까지 차례대로 누적시켜서 testCase랑 같으면 count를 올려주고 커지면 다음 수를 검사하면 된다. 코드로 보면 간단히 이해가 될 것이다.
int expressions(int testCase){int answer = 1; //자기 자신int range = testCase / 2 + 1; //연속된 자연수의 합으로 자신을 표현하려면 범위는//최대 자신의 반 +1 까지이다. 13 = 6(13/2) + 7(13/2 + 1)int sum; //누적 수for (int i=1; i<range; i++){ //1~(testCase/2 + 1) 까지 검사sum = i; //검사 처음 수 ifor(int j=i+1; j<=range && sum < testCase; j++){ //반복문을 통해 수를 누적 testCase 이상이면 반복문 breaksum += j;if (sum == testCase) //만약 누적수가 testCase와 같다면 countinganswer += 1;}}return answer;}이렇게 해서 4단계의 첫 문제를 풀었다! 점점 알고리즘 1일 1문제가 버거워진다...
728x90'레거시 > 레거시-알고리즘(3)' 카테고리의 다른 글
[프로그래머스 4단계] 알고리즘 35. 공항 건설하기 (0) 2018.04.26 [프로그래머스 4단계] 알고리즘 34. 최고의 집합 (0) 2018.04.25 [프로그래머스 3단계] 알고리즘 32.다음 큰 숫자 (0) 2018.04.20 [프로그래머스 3단계] 알고리즘 31. 야근지수 (0) 2018.04.19 [프로그래머스 3단계] 알고리즘 30. 시저 암호 (0) 2018.04.18