백준 1181번: 단어 정렬 - c언어

Yeonsu Summer·2022년 9월 3일
0

알고리즘

목록 보기
15/24
post-thumbnail

문제

알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.

  1. 길이가 짧은 것부터
  2. 길이가 같으면 사전 순으로

입력

첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다.

출력

조건에 따라 정렬하여 단어들을 출력한다. 단, 같은 단어가 여러 번 입력된 경우에는 한 번씩만 출력한다.

예시

입력출력
13
but
i
wont
hesitate
no
more
no
more
it
cannot
wait
im
yours
i
im
it
no
but
more
wait
wont
yours
cannot
hesitate

제출한 답

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    int length;
    char text[51];
} word;

int compare(const void *a, const void *b) {
    word A = *(word *)a;
    word B = *(word *)b;
    
    if (A.length > B.length) {
        return 1;
    }
    
    else if (A.length < B.length) {
        return -1;
    }
    
    return strcmp(A.text, B.text);
}

int main() {
    int N;
    
    scanf("%d", &N);
    
    word arr[N];
    
    for (int i = 0; i < N; i++) {
        scanf("%s", arr[i].text);
        
        arr[i].length = strlen(arr[i].text);
    }
    
    qsort(arr, N, sizeof(word), compare);
    
    printf("%s\n", arr[0].text);
    for (int i = 1; i < N; i++) {
        if (strcmp(arr[i - 1].text, arr[i].text)) {
            printf("%s\n", arr[i].text);
        }
    }
    
    return 0;
}

배운 점

퀵정렬 함수는 좌표 정렬하기, 나이순 정렬 문제에서 다뤄서 패턴이 익숙해졌다.

이번 문제에서 strcmp함수에 대해 알게 되었다.

이 전에는 문자열을 비교할 때 for문을 돌렸지만 시간이 오래 걸리고 코드가 너무 길어지는 문제점이 생겼다.

strcmp함수는 퀵정렬 함수와 반환값이 동일하다.

반환값설명
-1a < b
0a = b
1a > b

간과한 점

동일한 문자열이 존재할 경우, 하나만 출력해야한다.

이때도 strcmp를 사용하면 간단하게 해결할 수 있다.

strcmp(이전 문자열, 현재 문자열)의 반환값이 0이라면 존재하지 않는 것이기 때문에 결과가 출력되지 않는다.

profile
🍀 an evenful day, life, journey

0개의 댓글