알고리즘 공부/CodeUp 문제풀이
코드업 2844:도서 대출 시스템
티들
2023. 9. 23. 20:57
문제 설명
영일이는 학교에 필요한 간단한 도서 대출 시스템을 구현하였다.
이 프로그램은 n개의 명령을 수행한다.
명령의 형식은 아래와 같다.
명령번호 도서명
명령 번호가 1인 경우, 대출 리스트에 도서명을 추가한다.
명령 번호가 2인 경우, 대출 리스트에서 도서명을 제거한다. 만약 해당 도서가 대출 리스트에 없는 경우 "no book!"을 출력한다.
명령 번호가 0인 경우, 현재 대출중인 도서 상태를 모두 출력한다. 0인 경우는 도서명이 입력되지 않는다.
출력 형식은 “도서명 대출횟수”를 각각의 줄에 출력한다. 출력 순서는 명령으로 입력된 순서를 따른다.
그 외 다른 명령번호가 입력되면 "wrong command!"를 출력한다.
출력
첫째 줄에 총 명령어의 개수 n이 입력된다.(1<=n<=1,000)
둘째 줄부터 명령어가 한 줄에 한 개씩 입력된다. 명령 번호는 0~9의 정수이고, 도서명은 알파벳과 공백으로 구성되어 있다.
명령어의 형식은 "명령번호 도서명"이다.
입력
명령어를 수행한 결과를 출력한다.
입력 예시
8
1 oh my god
1 oh my goddess
1 oh my god
0
2 oh my god
2 oh my goal
4 oh my goal
0
출력 예시
oh my god 2
oh my goddess 1
no book!
wrong command!
oh my god 1
oh my goddess 1
나의 코드
#include <stdio.h>
#include <string.h>
typedef struct book { // book라는 구조체 선언
char name[100];
int num;
} BOOK;
int main() {
int n, num, i, j, a, count = 0;
char name[100], str[100];
scanf("%d", &n); // n번 반복할 변수
getchar();
BOOK list[n]; // 구조체 선언
for (i = 0; i < n; i++) {
fgets(str, sizeof(str), stdin); // 한 문장을 다 받음
if(strlen(str) > 2) { // 문자열의 길이가 2 초과라면 저장
sscanf(str, "%d %[^\n]", &num, name);
}
else { // 아니라면 숫자만 저장(아스키코드)
num = str[0] - 48;
}
size_t len = strlen(str);
if (len > 0 && str[len - 1] == '\n') {
str[len - 1] = '\0'; // 문자제거
}
if (num == 1) { // 1이라면 리스트 배열에 값 추가
int found = 0; // 변수 생성
for (j = 0; j < count; j++) {
if (strcmp(name, list[j].name) == 0) { // 중복이라면
list[j].num++; // 숫자만 증가
found = 1;
break;
}
}
if (!found) { // 중복이 아니라면
strcpy(list[count].name, name); //숫자와 이름 둘다 추가
list[count].num = 1;
count++; // 카운트 증가
}
} else if (num == 2) { // 2라면
int found = 0;
for (j = 0; j < count; j++) {
if (strcmp(name, list[j].name) == 0) { // 겹친다면 숫자 -1
list[j].num--;
if(list[j].num == 0 && j < count) // 대출 횟수가 0이라면
{
for(a=j;a<count-1;a++) // j부터 있는 배열까지 반복
{
strcpy(list[a].name, list[a+1].name);
list[a].num = list[a+1].num;// 배열 한칸 앞으로 이동
}
count--;
}
found = 1;
break;
}
}
if (!found) { // 겹치는 책이 없다면 출력
printf("no book!\n");
}
} else if (num == 0) { // 0이라면
for (j = 0; j < count; j++) {
if(list[j].num != 0) // num이 0이 아닐 때
printf("%s %d\n", list[j].name, list[j].num); // 책과 숫자 출력
}
} else {
printf("wrong command!\n"); // 명령어가 이상하면 출력
}
}
return 0;
}