#include <stdio.h>
int num[1000]={0};
int cnt[4]={0};
void count(int n); //1, 2, 3이 각각 몇개인지 알아보는 함수
int change_cnt(int n); //최소 바꿈 횟수
int where(int n, int a, int b); //바꿔야하는 위치 찾기
int main(void)
{
int n, i, result;
scanf(" %d", &n);
for(i=0; i<n; i++)
{
scanf(" %d", &num[i]);
}
count(n);
result=change_cnt(n);
printf("%d", result);
return 0;
}
void count(int n)
{
int i;
for(i=0; i<n; i++)
cnt[num[i]]++;
}
int change_cnt(int n)
{
int i, w, temp, c=0;
//1이 위치해야 하는 방
for(i=0; i<cnt[1]; i++)
{
if(num[i]!=1)
{
c++;
w=where(n, 1, num[i]);
temp=num[i];
num[i]=num[w];
num[w]=temp;
}
}
//2가 위치해야 하는 방
for(i=cnt[1]; i<(cnt[1]+cnt[2]); i++)
{
if(num[i]!=2)
{
c++;
w=where(n, 2, num[i]);
temp=num[i];
num[i]=num[w];
num[w]=temp;
}
}
//3이 위치해야 하는 방
for(i=cnt[1]+cnt[2]; i<n; i++)
{
if(num[i]!=3)
{
c++;
w=where(n, 3, num[i]);
temp=num[i];
num[i]=num[w];
num[w]=temp;
}
}
return c;
}
int where(int n, int a, int b)
{
int i;
if(b==2)
{
for(i=cnt[1]; i<(cnt[1]+cnt[2]); i++) //2가 위치할 자리에 a가 존재하는 경우
{
if(num[i]==a)
return i;
}
if(a==1) //2가 위치할 자리에 a가 존재하지 않고 3이 위치할 자리에 존재하는 경우
{
for(i=cnt[1]+cnt[2]; i<n; i++)
{
if(num[i]==1)
return i;
}
}
else if(a==3) //2가 위치할 자리에 a가 존재하지 않고 1이 위치할 자리에 존재하는 졍우
{
for(i=0; i<cnt[1]; i++)
{
if(num[i]==a)
return i;
}
}
}
else if(b==3)
{
for(i=cnt[1]+cnt[2]; i<n; i++) //3이 위치할 자리에 a가 존재하는 경우
{
if(num[i]==a)
return i;
}
if(a==1) //3이 위치할 자리에 a가 존재하지 않고 2가 위치할 자리에 존재하는 경우
{
for(i=cnt[1]; i<(cnt[1]+cnt[2]); i++)
{
if(num[i]==a)
return i;
}
}
else if(a==2) //3이 위치할 자리에 a가 존재하지 않고 1이 위치할 자리에 존재하는 경우
{
for(i=0; i<cnt[1]; i++)
{
if(num[i]==a)
return i;
}
}
}
}
2018.06.02 09:23
정올 - 실전대비 - 3가지 숫자 정렬하기(1016)
조회 수 367 추천 수 0 댓글 0