Skip to content

Conversation

@alirz-pixel
Copy link
Member

🚀 이슈 번호

Resolve: {#2325}

🧩 문제 해결

스스로 해결:

🔎 접근 과정

문제 해결을 위한 접근 방식을 설명해주세요.

  • 🔹 어떤 알고리즘을 사용했는지: 휴클리드 호제법
  • 🔹 어떤 방식으로 접근했는지

주어진 수에 대하여 왼쪽에서 오른쪽 순으로 / 오른쪽에서 왼쪽 순으로 최대 공약수들을 누적시킨 배열을 선언한다.
어느 index를 제거한다고 했을 때, gcd(L2R[i - 1], R2L[1 + 1]) 를 통해 최대공약수를 할 수 있다.

따라서 배열을 순회하면서 최대가 되는 최대 공약수를 찾고,
제거한 수와 최대공약수가 나누어 떨어지는가를 체크하여 결과를 추출하면 된다.

⏱️ 시간 복잡도

시간 복잡도 분석을 작성해주세요.
최악의 경우 수행 시간은 어느 정도인지 분석합니다.

  • Big-O 표기법: O(N * log N)
  • 이유:

유클리드 호제법은 log N의 시간복잡도를 가지고 있으며,
해당 알고리즘을 N번 수행하므로 O(N * log N) 이다.

💻 구현 코드

#include <iostream>
#include <vector>

using namespace std;

int gcd(int a, int b) {
	return b ? gcd(b, a % b) : a;
}

int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);

	int N;
	cin >> N;

	vector<int> arr(N);
	for (auto& e : arr)
		cin >> e;

	vector<int> L2R(N);
	vector<int> R2L(N);

	L2R[0] = arr[0];
	R2L[N - 1] = arr[N - 1];

	for (int i = 1; i < N; i++) {
		L2R[i] = gcd(L2R[i - 1], arr[i]);
	}

	for (int i = N - 2; i >= 0; i--) {
		R2L[i] = gcd(R2L[i + 1], arr[i]);
	}

	int result = R2L[1];
	int num = arr[0];

	if (result < L2R[N - 2]) {
		num = arr[N - 1];
		result = L2R[N - 2];
	}

	for (int i = 1; i < N - 1; i++) {
		int val = gcd(L2R[i - 1], R2L[i + 1]);
		if (result < val) {
			result = val;
			num = arr[i];
		}
	}

	if (num % result) {
		cout << result << " " << num;
	}
	else {
		cout << -1;
	}

	return 0;
}

@alirz-pixel alirz-pixel self-assigned this Jan 22, 2026
@alirz-pixel alirz-pixel linked an issue Jan 22, 2026 that may be closed by this pull request
@alirz-pixel alirz-pixel merged commit 8a0ed1c into main Jan 25, 2026
1 check passed
@alirz-pixel alirz-pixel deleted the munhyeong/2325/2 branch January 25, 2026 11:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

260122 : 코딩테스트

2 participants