개인사

[S2] 백준 24523번 내 뒤에 나와 다른 수 C++ 투 포인터 본문

알고리즘 공부/C++

[S2] 백준 24523번 내 뒤에 나와 다른 수 C++ 투 포인터

마달랭 2026. 1. 9. 16:49
728x90

리뷰

 

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

실버 2치고는 초기 설계 단계가 많이 복잡한 것 같다.

 

 

전역 변수

없음

 

 

함수

없음

 

 

문제풀이

  1. 변수 n을 초기화 하고, n에 값을 입력 받는다.
  2. 정수형 벡터 arr을 n+1크기로 초기화 하고, n개의 원소를 입력 받아 arr를 초기화한다.
  3. 정수형 벡터 ans를 n+1크기로, 초기값을 -1로 초기화 하고, 변수 l을 1로 저장한다.
  4. l이 n미만일 경우를 조건으로 하는 while루프를 수행하고, 변수 r을 l+1로 저장한다.
  5. r이 n이하면서 arr[l]이 arr[r]과 같다면 r을 증가시키는 while루프를 수행한다.
  6. while루프를 빠져나온 후 r값이 n보다 크다면 break처리한다.
  7. l이 r에 도달할때까지 l을 증가시키며 ans[l]의 값을 r로 저장한다.
  8. 탐색을 마친 후 ans에 저장된 값을 공백을 기준으로 출력한다.

 

트러블 슈팅

없음

 

 

참고 사항

  1. 1-based-indexing을 사용했으므로 0번 인덱스를 사용하지 않도록 유의한다.
  2. ans의 값을 출력할때도 foreach가 아닌 for문으로 인덱스를 지정하여 출력한다.

 

정답 코드

#include<iostream>
#include<vector>
using namespace std;

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

	int n;
	cin >> n;
	vector<int> arr(n + 1);
	for (int i = 1; i <= n; ++i) cin >> arr[i];

	vector<int> ans(n + 1, -1);
	int l = 1;
	while (l < n) {
		int r = l + 1;

		while (r <= n && arr[l] == arr[r]) ++r;
		if (r > n) break;
		while (l < r) ans[l++] = r;
	}
	for (int i = 1; i <= n; ++i) cout << ans[i] << " ";
}
728x90