1805 : 입체기동장치 생산공장
입력
첫째 줄에 입체기동장치의 갯수 n이 입력된다. (1 <= n <= 100)
둘째 줄부터 n+1째 줄까지 각 줄에 입체기동장치의 식별번호 a와 가스 보유량 b가 주어진다.
a는 중복 될 수 없지만 b는 중복될 수 있다. (1 <= a <= 100), (0 <= b <= 10,000)출력
첫째 줄부터 n번째 줄까지 각 줄에 식별번호를 오름차순으로 정렬해 가스 보유량과 같이 출력한다.
풀이
number과 gas를 맴버로 지닌 구조체 device를 만든다.
정수 x와 추후 버블 정렬에 사용될 정수 temp를 선언한다.
정수 x의 값을 첫 번째로 입력받아 구조체 device 배열의 크기를 정의한다.
정의된 크기의 구조체 배열 devices의 number값과 gas값을 전부 입력받는다.
버블정렬을 응용하여 각각의 devices의 number 값을 비교하여 순서를 정리한다.
number의 순서대로 정렬된 devices를 출력한다
#include <stdio.h>
struct device
{
int number;
int gas;
};
int main() {
int x, temp;
scanf("%d", &x);
// 첫 번째 입력받은 정수만큼의 크기에 구조체 배열 선언
struct device devices[x];
// 구조체 변수값 입력
for (int i = 0; i < x; i++) {
scanf("%d %d", &devices[i].number, &devices[i].gas);
}
// 버블 정렬을 이용하여 구조체 순서 정렬
for (int i = 0; i < x; i++) {
for (int j = i+1; j < x; j++) {
if (devices[i].number > devices[j].number) {
temp = devices[i].number;
devices[i].number = devices[j].number;
devices[j].number = temp;
temp = devices[i].gas;
devices[i].gas = devices[j].gas;
devices[j].gas = temp;
}
}
}
// 정렬된 구조체 출력
for (int i = 0; i < x; i++) {
printf("%d %d\n", devices[i].number, devices[i].gas);
}
return 0;
}
4012 : 석차 계산
입력
1) 첫 번째 줄은 처리할 점수의 개수 n ( n <= 200 )
2) 두 번째 줄은 처리할 점수 데이터 (0~100점)
(단, 각각의 점수는 빈칸으로 구별한다.)출력
석차를 계산한 후 점수와 석차를 출력한다.
풀이
score와 grade를 맴버로 지닌 구조체 rank를 만든다.
정수 x를 선언한다.
정수 x의 값을 첫 번째로 입력받아 구조체 rank 배열의 크기를 정의한다.
정의된 크기의 구조체 배열 ranks의 score값을 전부 입력받는다.
모든 ranks의 맴버 변수 grade는 초기값으로 1을 받는다.
score값을 비교하며 비교되는 값이 비교하는 값보다 작을때마다 grade를 1씩 추가한다.
구조체 변수 ranks 전부 출력한다.
#include <stdio.h>
struct rank
{
int score;
int grade;
};
int main() {
int x;
scanf("%d", &x);
// 첫 번째로 입력받은 정수 크기의 구조체 생성
struct rank ranks[x];
// 구조체 변수에 값 할당
for (int i = 0; i < x; i++) {
scanf("%d", &ranks[i].score);
}
// 석차 계산
for (int i = 0; i < x; i++) {
ranks[i].grade = 1;
for (int j = 0; j < x; j++) {
if (ranks[i].score < ranks[j].score) {
ranks[i].grade++;
}
}
}
// 점수와 석차 출력
for (int i = 0; i < x; i++) {
printf("%d %d\n", ranks[i].score, ranks[i].grade);
}
return 0;
}
창작문제_ 회계 관리 시스템
입력
첫째 줄에 부원의 수 N 이 주어진다. (1 ≤ N ≤ 100)
이후 각 부원의 대해 다음 정보가 주어진다.
- 첫째 줄에는 이름(공백 없음), 학번, 지출 내역의 수 M 이 주어진다. (1 ≤ M ≤ 100)
- 다음 M 개의 줄에는 각 지출에 대한 항목명(공백 없음), 금액(0 이상 10,000 이하의 정수), 날짜(YYYY-MM-DD 형식)가 주어진다.
출력
각 부원의 대해 이름/학번/총지출 형식으로 한 줄씩 출력한다.
모든 부원의 정보를 출력한 뒤, 한 줄을 띄우고 지출이 가장 많은 부원의 정보를 다음 형식으로 출력한다.
지출 총액이 같은 경우, 먼저 입력된 부원의 출력한다.풀이
name, number, count, total을 맴버로 갖는 구조체 member와 name, price, data를 맴버로 갖는 구조체 pay를 선언한다.
문제 조건 사항에 함수 사용이라는 조건이 존재하였다.
따라서 ->(화살표 연산자)를 사용하여 all값에 가격을 더해주는 함수 add를 선언하였다.
또한 포인터를 사용하는 조건 또한 존재하였기에 구조체 pay 변수를 포인터함수 pays로 선언하였다.
동적 메모리를 사용하여 members와 pays의 크기를 회원 수(n)과 총 지출 수(count)만큼 반복하여 입력받는다.
이후 회원별로 지출을 더하여 회원별 총 지출을 출력하고, 최고 지출자를 출력한다.
#include <stdio.h>
#include <stdlib.h>
struct member {
char name[100];
int number;
int count;
int all;
};
struct pay {
char name[100];
int price;
char day[100];
};
// 총 지출을 계산하는 함수 선언
void add(int price, struct member *member) {
member->all += price;
}
int main() {
int n, max = 0;
struct member *members;
struct pay *pays;
printf("회원 수를 입력하세요 : ");
scanf("%d", &n);
members = (struct member *)malloc(sizeof(struct member) * n);
for (int i = 0; i < n; i++) {
printf("\n[%d번째 회원 정보 입력]\n", i+1);
printf("이름 : ");
scanf("%s", members[i].name);
printf("학번 : ");
scanf("%d", &members[i].number);
printf("지출 내역 수 : ");
scanf("%d", &members[i].count);
members[i].all = 0; // 총 지출 초기화
// 구조체 pay 크기의 동적 메모리 할당
pays = (struct pay *)malloc(sizeof(struct pay) * members[i].count);
for (int j = 0; j < members[i].count; j++) {
printf("\n [%d번째 지출 내역]\n", j + 1);
printf(" 항목명 : ");
scanf("%s", pays[j].name);
printf(" 금액 : ");
scanf("%d", &pays[j].price);
printf(" 날짜 (YYYY-MM-DD) : ");
scanf("%s", pays[j].day);
add(pays[j].price, &members[i]);
}
free(pays); // 반복마다 동적 할당 해제
}
// 회원별 총 지출 출력
for (int i = 0; i < n; i++) {
printf("\n회원 : %s | 학번 : %d | 총 지출 : %d원\n", members[i].name, members[i].number, members[i].all);
}
// 최고 지출자 탐색
for (int i = 1; i < n; i++) {
if (members[i].all > members[max].all) {
max = i;
}
}
// 최고 지출자 출력
printf("\n[최고 지출자]\n");
printf("이름 : %s\n", members[max].name);
printf("학번 : %d\n", members[max].number);
printf("총 지출 : %d원\n", members[max].all);
free(members);
return 0;
}
출력결과