4631 대칭 정렬

 

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

 

4631번: 대칭 정렬

문제 영현이는 서커스 회사에 다닌다. 방금 영현이는 길이 기준으로 오름차순으로 정렬된 이름 목록을 출력하는 프로그램을 작성했다(이름은 적어도 한자 이상이다).  하지만, 팀장은 그런 방식의 출력을 원하지 않고, 대신 맨 위와 아래는 짧고 가운데는 긴 대칭적인 출력을 원한다. 그 규칙은 이름 한 쌍이 서로 반대 목록에 속해야 하고 더 긴 이름이 중간에 오는 식이다. 한 쌍의 첫 번째로 오는 이름이 위쪽 목록에 있어야 한다.  첫 번째 예시가 밑에 있는데,

www.acmicpc.net

 

문자열을 입력받아서 좌우가 대칭되도록 글자 길이 비율을 맞춰서 출력하는 단순한 문제이다.

글자 길이를 확인하여 정렬하여 한 칸씩 건너뛰어서 출력하다가 거꾸로 한칸씩 다시 출력하도록 풀었다.

 

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int main()
{
    int n,i,j,k,cnt=0;
    char str[16][27];
    while(1) {
        k=0;
        scanf("%d", &n);
        if(!n) break;
        for(i=0; i<n; i++) scanf("%s", str[i]);
        for(i=n-1; i>=0; i--) {
            for(j=0; j<i; j++) {
                if(strlen(str[j])>strlen(str[j+1])) swap(str[j], str[j+1]);
            }
        }
        j=-2;
        printf("SET %d\n", ++cnt);
        for(i=0; i<n-1; i++) {
            if(j>n-3) {if(n%2) j--; else j++; printf("%s\n", str[j]); k=1;}
            if(!k) j+=2;
            if(k) j-=2;
            printf("%s\n", str[j]);
        }
    }
    return 0;
}

 

어찌저찌 정답은 잘 나왔는데 왜인지 틀렸다.

그래서 나는 지금까지 생각안한 테스트 케이스를 고민하다가, 1이나 2가 떠올랐다.

그렇다.

테스트 케이스의 수가 3개 미만일 때는 출력이 아예되지 않는 끔찍한 일과 3일때는 마지막 하나가 출력이 되지 않는 끔찍한 오류가 있었다.

그도 그럴 것이 내가 출력하는 코드 내부의 if문에 조건을 n-3을 기준으로 했으니 3 미만으로 입력이 되면 음수가 기준이 되어버렸기 때문이다.

그래서 그 점을 생각해서 코드를 고치니 풀 수 있었다.

 

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int main()
{
    int n,i,j,k,cnt=0;
    char str[16][27];
    while(1) {
        k=0;
        scanf("%d", &n);
        if(!n) break;
        for(i=0; i<n; i++) scanf("%s", str[i]);
        for(i=n-1; i>=0; i--) {
            for(j=0; j<i; j++) {
                if(strlen(str[j])>strlen(str[j+1])) swap(str[j], str[j+1]);
            }
        }
        j=-2;
        printf("SET %d\n", ++cnt);
        if(n<3) {for(i=0; i<n; i++) printf("%s\n", str[i]); continue;}
        for(i=0; i<n-1; i++) {
            if(j>n-3) {if(n%2) j--; else j++; printf("%s\n", str[j]); k=1;}
            if(!k) j+=2;
            if(k) j-=2;
            printf("%s\n", str[j]);
        }
        if(n==3) printf("%s\n", str[j-1]);
    }
    return 0;
}

+ Recent posts