문제
취업 준비생 임스는 취업 준비를 하면서 그날그날 무슨 공부를 하였는지 기록하기 위해 데일리 인증이라는 스터디를 시작했다. 임스는 매일 무슨 공부를 하였는지 적으면서 몇 개의 규칙을 정했다.
- 매일 꾸준히 백준 문제를 푼다.
- 백준 문제를 하루 문제 이상 풀었고, 그 외의 다른 공부는 개 이상 진행하였다. 다른 공부들은 영어 대소문자, 숫자, 공백으로만 이루어진 최대 길이 의 문자열이다.
- 인증 기록으로는 백준 문제 링크를 제일 마지막에 작성하고, 그 외 학습 기록은 문자열 길이가 짧은 순으로 정렬해서 작성한다. 만약 문자열의 길이가 같다면, 사전 순으로 정렬한다.
- 문자는 아스키코드 기준으로 비교한다.
- 백준 문제 링크는 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)
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 5397 : 키로거 ( SILVER 2 ) / C, Python (0) | 2023.11.28 |
---|---|
[ BOJ ] 11723 : 집합 ( SILVER 5 ) / C, Python (0) | 2023.11.28 |
[ BOJ ] 11899 : 괄호 끼워넣기 ( SILVER 3 ) / C, Python (0) | 2023.11.27 |
[ BOJ ] 1406 : 에디터 ( SILVER 2 ) / C, Python (0) | 2023.11.26 |
[ BOJ ] 11656 : 접미사 배열 ( SILVER 4 ) / C, Python (0) | 2023.11.26 |