본문 바로가기
알고리즘 (C++)

[백준]2018: 수들의 합 5

by Dev_Hugh 2023. 12. 5.
728x90
반응형

https://www.acmicpc.net/problem/2018

 

2018번: 수들의 합 5

어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1 ≤ N ≤ 10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한

www.acmicpc.net

 

투 포인터 개념에 대해 처음 접해봤다.

사실상 반복문에서 범위를 빠르게 정해가며 계산하기 위한 개념임을 배웠다.

즉 while 문을 도는데 start와 end 변수를 활용해 start ~ end까지 합을 구해가며 주어진 N과 비교하는 방법이다.

start, end, cnt 변수를 준비하고 start = 1, end = 1, cnt = 1에서 시작한다.

start + end = sum으로 치환

만약 sum < N -> end를 1씩 늘리고 sum += end

만약 sum == N -> cnt와 end를 1씩 늘리고 sum += end

만약 sum > N -> sum -= start 하고 start를 1씩 늘린다

 

ex) N = 5일 때
start = 1, end = 1, sum = 0 -> sum = 2 < N
start = 1, end = 2, sum = 3 -> sum < N
start = 1, end = 3, sum = 6 -> sum > N

start = 2, end = 3, sum = (6-1) -> sum == N

이런 식으로 찾아간다.

#include<iostream>

#define FastIO ios::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL);

using namespace std;

int main(void)
{
	FastIO;
	int N = 0;
	int start = 1, end = 1, sum = 1, cnt = 1;

	cin >> N;
	while(end != N)
	{
		if (N == sum)
		{
			cnt++;
			end++;
			sum += end;
		}
		else if (sum < N)
		{
			end++;
			sum += end;
		}
		else
		{
			sum -= start;
			start++;
		}
	}

	cout << cnt << "\n";
	return 0;
}
728x90
반응형

'알고리즘 (C++)' 카테고리의 다른 글

[백준]1296번: 팀 이름 정하기  (0) 2023.12.13
[백준]25497번: 기술 연계마스터 임스  (0) 2023.12.06
[백준]11501번: 주식  (0) 2023.11.27
[백준]11652번: 카드  (0) 2023.11.24
[백준]15900번: 나무 탈출  (1) 2023.11.23