-- 예전 기록/BOJ

[ BOJ ] 29730 : 임스의 데일리 인증 스터디 ( SILVER 3 ) / C, Python

rejo 2023. 11. 27. 10:50

문제

취업 준비생 임스는 취업 준비를 하면서 그날그날 무슨 공부를 하였는지 기록하기 위해 데일리 인증이라는 스터디를 시작했다. 임스는 매일 무슨 공부를 하였는지 적으면서 몇 개의 규칙을 정했다.

  • 매일 꾸준히 백준 문제를 푼다.
  • 백준 문제를 하루 문제 이상 풀었고, 그 외의 다른 공부는 개 이상 진행하였다. 다른 공부들은 영어 대소문자, 숫자, 공백으로만 이루어진 최대 길이 의 문자열이다.
  • 인증 기록으로는 백준 문제 링크를 제일 마지막에 작성하고, 그 외 학습 기록은 문자열 길이가 짧은 순으로 정렬해서 작성한다. 만약 문자열의 길이가 같다면, 사전 순으로 정렬한다.
  • 문자는 아스키코드 기준으로 비교한다.
  • 백준 문제 링크는 boj.kr/문제 번호 형식이다. 문제 번호가 작은 순서대로 정렬해서 작성한다. 문제 번호는  이상  이하이다.

임스가 하루 동안 공부한 기록들이 정렬되지 않은 채로 주어졌을 때, 주어진 규칙에 맞게 정렬 후 출력한다.

입력

첫 번째 줄에는 임스가 하루동안 공부한 기록의 개수 이 주어진다. (1 ≤ N ≤ 1 000)

다음 개의 줄에 임스가 하루동안 공부한 기록들이 한 줄에 하나씩 주어진다.

학습 기록은 공백으로 시작하거나 끝나지 않는다. 같은 공부 기록이 여러 번 주어질 수도 있다.

출력

임스가 공부한 기록들을 주어진 규칙에 맞게 정렬 후 한 줄에 하나씩 출력한다.

풀이 과정

백준 문제 링크로 주어진 공부 기록은 따로 빼서, 문제 번호가 작은 순서대로 나중에 출력하고,

나머지 공부 기록을 먼저 사전 순으로 정렬하여 출력한다.

C

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

int strlencmp(char* a, char* b) {
    if (strlen(a) > strlen(b)) return -1;
    else if (strlen(a) < strlen(b)) return 1;
    else {
        for (int i = 0; i < strlen(a); i++) {
            if (a[i] < b[i]) return 1;
            else if (a[i] > b[i]) return -1;
        }
    }

    return 0;
}

int toint(char* str) {
    int now = 0;
    for (int i = 0; i < strlen(str); i++) {
        now *= 10;
        now += str[i] - '0';
    }

    return now;
}

int main(void) {
    int n;
    scanf("%d", &n);
    getchar();

    char arr[1001][105];
    int arrSize = 0;

    char boj[1001][105];
    int bojSize = 0;
    char bojstr[105] = "boj.kr/";
    for (int i = 0; i < n; i++) {
        char now[105];
        gets(now);

        char boj_tmp[105];
        strcpy(boj_tmp, now);
        boj_tmp[7] = 0;

        if (!strcmp(boj_tmp, bojstr)) {
            char* boj_ptr = now+7;
            strcpy(boj[bojSize++], boj_ptr);
        }
        else {
            strcpy(arr[arrSize++], now);
        }
    }

    // Selection Sort - arr
    for (int i = 0; i < arrSize - 1; i++) {
        int min = i;
        for (int j = i + 1; j < arrSize; j++) {
            if (strlencmp(arr[min], arr[j]) < 0) min = j;
        }

        if (min != i) {
            char tmp[105];
            strcpy(tmp, arr[min]);
            strcpy(arr[min], arr[i]);
            strcpy(arr[i], tmp);
        }
    }

    // Selection Sort - boj
    for (int i = 0; i < bojSize - 1; i++) {
        int min = i;
        for (int j = i + 1; j < bojSize; j++) {
            if (toint(boj[min]) > toint(boj[j])) min = j;
        }

        if (min != i) {
            char tmp[105];
            strcpy(tmp, boj[min]);
            strcpy(boj[min], boj[i]);
            strcpy(boj[i], tmp);
        }
    }

    for (int i = 0; i < arrSize; i++) printf("%s\n", arr[i]);
    for (int i = 0; i < bojSize; i++) printf("%s%s\n", bojstr, boj[i]);
    return 0;
}

Python

import sys
input = sys.stdin.readline
n = int(input().rstrip())
arr = [input().rstrip() for _ in range(n)]

study = []
boj = []
for a in arr:
    if a[:7] == 'boj.kr/':
        boj.append(int(a[7:]))
    else:
        study.append(a)

study.sort(key=lambda x:(len(x), x))
for s in study: print(s)
boj.sort()
for b in boj: print('boj.kr/%d'%b)