문제출처 : https://www.acmicpc.net/problem/1898
code
#include <iostream>
using namespace std;
int S[50001];
int index[50001] = { 0, };
int result[50001];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
cin >> S[i];
for (int i = 1; i <= n; i++)
{
//첫번째자리일떄
if (S[i] == 1)
{
if (index[1] == 0)
{
index[1] = 1;
result[i] = 1;
}
else
{
result[i] = 2;
}
}
else if(S[i]==n)//마지막자리일떄
{
if (index[n - 1] == 0)
{
index[n - 1] = n;
index[n] = 1;
result[i] = n - 1;
}
else if(index[n-1]!=0 && index[n]==0)
{
index[n] = n;
result[i] = n;
}
else
{
result[i] = n - 1;
}
}
else//중간에있는 자리일떄
{
if (index[S[i]] != 0)
{
result[i] = index[S[i]];
}
else if (index[S[i] - 1] == 0)
{
index[S[i] - 1] = S[i];
index[S[i]] = 1;
result[i] = S[i] - 1;
}
else
{
index[S[i]] = S[i];
result[i] = S[i];
}
}
}
for (int i = 1; i <= n; i++)
cout << result[i] << '\n';
return 0;
}
기나긴 시험기간이 끝나고 종강이후 처음푸는 백준이다.
그동안 하도안풀었더니 머리가 굳어서 시간이좀 많이걸렸다 ㅠㅠ
핵심은 조건에 맞는 오름차순을 지켜야 한다는 것이다.
조건중에 인접한 숫자의 차이가 1이하 라는 조건에 의해서 짝이 지어지는 숫자들이 있는데,
예제에서 8과7, 5와4, 3과2가 짝이 지어지고,
1 6은 자기자신과 짝이 지어지게 된다.
이 경우의수를 각각나눠서 조건문으로 풀어주면 된다.