문제 위치 : https://school.programmers.co.kr/learn/courses/30/lessons/12924
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
코드가 간단한데 이는 풀이가 수학적 성질을 기반에 두고 있다.
이 문제는 등차수열의 합과도 같다.
k * a + (k * (k - 1)) / 2 = n
등차수열을 따라 a에서 부터 k개의 자연수의 합은 위와 같이 표시된다.
a = (n - (k * (k - 1)) / 2) / k
이를 a에 대해 정리하면 위와 같다.
여기서 문제가 성립하기 위한 조건은 a가 자연수여야 한다는 점이다.
따라서 (n - (k * (k - 1)) / 2) 를 k로 나눈 나머지 값이 0인지만 확인해주면 된다.
#include <string>
#include <vector>
using namespace std;
int solution(int n) {
int answer = 0;
for (int k = 1; k * (k - 1) / 2 < n; ++k)
if ((n - (k * (k - 1) / 2)) % k == 0)
answer++;
return answer;
}
수학적 원리로 푸는 문제라 기록을 한 번 남겨보았다.
'문제 풀이 > 문제 풀이(BOJ)' 카테고리의 다른 글
[Silver V] 10431 - 줄세우기 (0) | 2025.01.21 |
---|---|
[Silver V] 그룹 단어 체커 (0) | 2024.12.18 |
[Silver V] 수 정렬하기 - 15688 (0) | 2024.11.24 |
[Silver V] 마트료시카 합치기 - 25631 (0) | 2024.11.23 |
[Silver IV] 시간초과 - 11332 (0) | 2024.11.17 |