Loading [MathJax]/jax/output/HTML-CSS/jax.js
본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 1015번: 수열 정렬 -C++

728x90

[백준알고리즘] 1015번: 수열 정렬 -C++

1015번: 수열 정렬 (acmicpc.net)

 

1015번: 수열 정렬

P[0], P[1], ...., P[N-1]은 0부터 N-1까지(포함)의 수를 한 번씩 포함하고 있는 수열이다. 수열 P를 길이가 N인 배열 A에 적용하면 길이가 N인 배열 B가 된다. 적용하는 방법은 B[P[i]] = A[i]이다. 배열 A가 주

www.acmicpc.net

이번 문제는 이해하는데 어려움이 있었다.

 

문제를 이해하면 푸는 건 쉽게 풀 수 있는 유형이었다.

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

 


 

먼저, 문제를 이해한 내용에 대해 얘기해봐야겠다.

 

유독 문제를 이해하지 못했는데.. 문제에서 요구하는 것은 다음과 같다.

  • 배열 A가 주어진다.
  • 배열 A에 대해서 배열 B와 수열 P는 다음과 같은 관계를 갖는다.
    • A[i]=B[P[i]]
  • 이때 배열 B가 비내림차순이 되도록 하는 수열 P를 찾아야 한다.
    • B비내림차순의 배열
    • 찾아야 하는 것은 P

 

P가 비내림차순이라는 것인지.. B가 비내림차순이라는 것인지... 이해할 수 없었는데 어쩌다 보니 이해했고 문제를 풀 수 있었다.

 


 

위의 문제 해석을 이해했으면 예제를 통해서 더 확실히 알 수 있다. 배열 A{2,3,1}일 때의 예를 통해 확인해보겠다.

  • A[0]=2=B[P[0]]
  • A[1]=3=B[P[1]]
  • A[2]=1=B[P[2]]

 

여기서, 배열 B비내림차순의 배열이기 때문에 배열 안의 값은 {1,2,3} 일 것이다.

  • B[P[2]]=1=B[0]
  • B[P[0]]=2=B[1]
  • B[P[1]]=3=B[2]

 

위와 같이 된다면 배열 PB의 인덱스를 매칭 시킬 수 있다.

  • P[2]=0
  • P[0]=1
  • P[1]=2

 

따라서 수열 P는 다음과 같다. P={1,2,0}

 


 

위의 방식대로 푼 C++ 코드다.

#include <iostream>
#include <vector>
#include <algorithm>

void solve(void);

int main(void)
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(NULL);

	solve();
}

void solve(void)
{
	int size;
	std::cin >> size;

	std::vector<std::pair<int, int>> val_index;
	for (int i = 0; i < size; i++)
	{
		int a_val;
		std::cin >> a_val;
		val_index.push_back(std::make_pair(a_val, i));
	}

	std::sort(val_index.begin(), val_index.end());

	std::vector<int> p(size);
	for (int i = 0; i < size; i++)
		p[val_index[i].second] = i;

	for (auto a : p)
		std::cout << a << ' ';
}
728x90