본문 바로가기

프로그래밍/PS

[C++] 백준 1024번: 수열의 합

반응형

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

 

1024번: 수열의 합

첫째 줄에 N과 L이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이고, L은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다.

www.acmicpc.net

오답 풀이

예제에 대해서 하나씩 계산을 해보았다.

우선, N에 예제 출력의 수열 길이를 나누었다.

그러자 규칙을 발견했다.

규칙은 다음과 같았다.

주어진 수를 N, 출력이 될 수열의 길이가 L이라고 했을 때,

다음 중 하나를 만족하면 답이 있다.

  • L이 짝수이며 N에 L을 나누었을 때 나머지가 0.5이다.
  • L이 홀수이며 N에 L을 나누었을 떄 나누어 떨어진다.

출력이 될 수열에서 첫 번째 값은 다음처럼 계산했다.

  • L이 짝수라면 N에 L을 나눈 몫에 L에 2를 나눈 몫을 빼고 1을 더한다.
  • L이 홀수라면 N에 L을 나눈 몫이 L에 2를 나눈 몫을 뺀다.

이렇게 작성한 코드가 다음과 같다.

더보기
#include <bits/stdc++.h>

using namespace std;

#define FOR(i, N)	for(int i = 0; i < N; ++i)
#define TC(T)		int T; cin >> T; while(T--)
#define FAST_IO		cin.tie(NULL); ios::sync_with_stdio(false);
#define ERR			1e-13
#define EL			"\n"
#define VI			vector<int>
#define VVI			vector<VI>
#define VVVI		vector<VVI>
#define VP			vector<pair<int, int>>
#define VVP			vector<VP>
#define VC			vector<char>
#define VVC			vector<VC>
#define VB			vector<bool>
#define VVB			vector<VB>
#define VVVB		vector<VVB>

int main() {
#ifdef DEBUG
	freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
#endif
	FAST_IO;

	int N, L;
	cin >> N >> L;

	VI ans;
	double quotient = N;
	while (quotient >= L) {
		// 주어진 수에 나누려고 하는 개수를 나누어 몫을 구합니다.
		quotient = (double)N / L;

		// 짝수개로 나누려고 하며, 몫의 소수점이 0.5입니다.
		bool condition1 = L % 2 == 0 && quotient - (int)quotient / 1 == 0.5;

		// 홀수개로 나누려고 하며, 몫이 나누어 떨어집니다.
		bool condition2 = L % 2 == 1 && quotient - (int)quotient / 1 == 0;

		// 위 두 조건 중 하나를 만족하면 해당하는 수열이 있습니다.
		if (condition1 || condition2) {
			int startNumber = (N / L) - (L / 2) + (L % 2 == 1 ? 0 : 1);
			for (int i = 0; i < L; i++) {
				ans.push_back(startNumber + i);
			}
			break;
		}

		// 나누는 개수를 늘려줍니다.
		L++;
	}

	int ans_size = ans.size();
	if (ans_size == 0) {
		cout << -1 << EL;
	} else {
		for (auto& el : ans)
			cout << el << ' ';
		cout << EL;
	}

	return 0;
}

그리고 결과는

아래 블로그의 첫 번째 풀이와 동일하나 왜 틀렸는지는 알 수 없었다.

https://sexycoder.tistory.com/97

 

[1024번] 수열의 합

문제에 대한 접근 이 문제는 접근방식 자체가 좀 어려웠다. 오답률이 높아서 쫄았고 어떻게 풀어야 할지 처음에는 감이 안왔지만 L을 홀수/짝수로 나누어 생각하면서 점점 풀이의 실마리가 보이

sexycoder.tistory.com

 

반응형