문제출처 : https://www.acmicpc.net/problem/20310
처음에는 0의 개수와 1의갯수를세서 다시 배열해주면 되겠지~ 하고 냈더니 서브태스크 25점을 맞았다.
code1)
#include <stdio.h>
#include <string.h>
int main()
{
int i, cnt0 = 0, cnt1 = 0;
char S[500] = { 0 }, result[500] = { 0 };
gets(S);
int len = strlen(S);
for (i = 0; i < len; i++)
{
if (S[i] == '0')
cnt0++;
if (S[i] == '1')
cnt1++;
}
cnt0 = cnt0 / 2;
cnt1 = cnt1 / 2;
len = len / 2;
for (i = 0; i < len; i++)
{
if (i < cnt0)
result[i] = '0';
else
result[i] = '1';
}
puts(result);
return 0;
}
문제를 다시읽어보니 재배열을 하는것이 아니라, 원래문자열에서 0과 1을 절반씩 없애는 것이였다.
사전순으로 정렬하랬으니까, 0은 뒤에서부터 삭제해주는것이 베스트고, 1은 앞에서부터 삭제해주는것이 베스트일것이다.
code2)
#include <stdio.h>
#include <string.h>
int main()
{
int i, cnt0 = 0, cnt1 = 0;
char S[500] = { 0 }, result[500] = { 0 };
gets(S);
int len = strlen(S);
for (i = 0; i < len; i++)
{
if (S[i] == '0')
cnt0++;
if (S[i] == '1')
cnt1++;
}
cnt0 /= 2; cnt1 /= 2;
for (i = 0; i < len; i++)
if (S[i] == '1' && cnt1 != 0)
{
S[i] = '2';
cnt1--;
}
for (i = len - 1; i >= 0; i--)
if (S[i] == '0' && cnt0 != 0)
{
S[i] = '2';
cnt0--;
}
int j = 0;
for (i = 0; i < len; i++)
{
switch (S[i])
{
case '1':
result[j] = '1';
j++;
break;
case '0':
result[j] = '0';
j++;
break;
case '2':
break;
}
}
puts(result);
return 0;
}