Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- c++
- XSS Game
- 웹페이지 만들기
- WarGame
- PHP 웹페이지 만들기
- 기계학습
- 백준
- 자료구조 복습
- HTML
- BOJ
- 파이썬
- hackctf
- 생활코딩
- Javascript
- 숙명여자대학교 정보보안 동아리
- CSS
- BOJ Python
- 드림핵
- Sookmyung Information Security Study
- c
- 머신러닝
- The Loard of BOF
- C언어
- hackerrank
- Python
- lob
- 풀이
- 숙명여자대학교 정보보안동아리
- SWEA
- siss
Archives
- Today
- Total
혜랑's STORY
[2020-2학기 C언어 7주차] 본문
#SWEA 8888 : 시험
- 풀이
이 문제를 해결하기 위해 필요한 값은 ①문제 배점, ②각 참가자의 점수, ③각 참가자의 맞은 문제의 수 정도로 나눌 수 있을 것 같다.
①문제 배점 구하는 방법
- 문제의 배점은 해당 문제를 몇 명의 참가자가 틀렸는지 결정하게 된다. 즉, 각 참가자들의 정보를 입력받을 때 '0'을 입력받으면 문제 배점에 1을 더해주면 되는 것이다.
②각 참가자의 점수, ③각 참가자의 맞은 문제의 수 구하기
- 각 참가자의 점수를 구하는 것과 각 참가자의 맞은 문제의 수를 구하는 것은 동시에 진행할 수 있다. 각 문제를 맞췄다면 ①문제 배점에서 구해둔 점수를 해당 참가자의 점수표에 더하고, 맞춘 문제의 수를 1 증가시켜주면 된다.
문제가 길어서 어렵게 생각했지만 생각보다 어렵지 않은 문제였다. 그러나 시간초과가 나와서 어떻게 수정해야 시간이 덜 걸릴지 고민중이다.
- 코드
#include <stdio.h>
#include <stdlib.h>
int main() {
int Tc, T, N, P;
scanf("%d", &Tc);
for (int tc = 1; tc <= Tc; tc++) {
scanf("%d %d %d", &N, &T, &P);
//점수표 만들기
int* score_list = (int*)malloc(sizeof(int) * T);
for (int i = 0; i < T; i++)
score_list[i] = 0;
//각 응시생별 맞은 문항 입력받기
int** human = malloc(sizeof(int*) * N);
for (int i = 0; i < N; i++) {
human[i] = malloc(sizeof(int) * T);
for (int j = 0; j < T; j++) {
scanf("%d", &human[i][j]);
if (human[i][j] == 0)
score_list[j] += 1;
}
}
/*
//점수표 값 채워넣기 <- 아래에 포함됨
for (int i = 0; i < N; i++) {
for (int j = 0; j < T; j++) {
scanf("%d", &human[i][j]);
if (human[i][j] == 0)
score_list[j] += 1;
}
}
*/
//각 응시생 별 점수, 맞춘 문항수 담을 배열 만들기
int** h_score = malloc(sizeof(int*) * N);
for (int i = 0; i < N; i++) {
h_score[i] = malloc(sizeof(int) * 2);
for (int j = 0; j < 2; j++)
h_score[i][j] = 0;
}
//각 응시생 별 점수 계산하기
for (int i = 0; i < N; i++) {
for (int j = 0; j < T; j++) {
if (human[i][j] == 1) {
h_score[i][0] += score_list[j];
h_score[i][1]++;
}
}
}
int rank = 1; //rank는 1부터 시작한다.
for (int i = 0; i < N; i++) {
if (i == P - 1)
continue; //i가 P-1과 같으면 자신인 경우이므로 패스
if (h_score[i][0] > h_score[P - 1][0]) //점수가 나보다 더 큰경우
rank++;
else if (h_score[i][0] == h_score[P - 1][0]) {
if (h_score[i][1] > h_score[P - 1][1]) //점수는 나와 같지만, 맞춘 문제의 수가 나보다 많은 경우
rank++;
else if (h_score[i][1] == h_score[P - 1][1]) //점수와 맞춘 문제의 수가 나와 같지만, 나보다 번호가 작은 경우
if (i < (P - 1))
rank++;
}
}
printf("#%d %d %d\n", tc, h_score[P - 1][0], rank);
}
return 0;
}
- 실행결과
#SWEA 8457번 : 알 덴테 스파게티
- 풀이
문제의 조건을 정리하면
① 파스타 면을 (B-E)초 ~ (B+E)초를 삶아야한다.
② N개의 모래시계가 주어지고, i번째 모래시계는 Xi초가 된다.
이다. 즉, Xi초를 입력받은 뒤 (B-E)초 ~ (B+E)초 사이의 값으로 나누었을 때 나머지가 0이되는 시계의 개수를 구하면 되는 것이다. <- for문과 if문을 사용하여 간단하게 구할 수 있었다.
- 코드
#include <stdio.h>
int main() {
int N, B, E, T;
scanf("%d", &T);
for (int tc = 1; tc <= T; tc++) {
scanf("%d %d %d", &N, &B, &E);
int clock, cnt = 0;
for (int i = 0; i < N; i++) {
scanf("%d", &clock);
for (int temp = B - E; temp <= B + E; temp++) {
if (temp % clock == 0) {
cnt++;
break;
}
}
}
printf("#%d %d\n", tc, cnt);
}
return 0;
}
- 실행결과
'2020 SISS 21기 활동 > 2학기 C언어' 카테고리의 다른 글
[2020-2학기 9주차 C언어] (0) | 2020.11.29 |
---|---|
[2020-2학기 C언어 8주차] (0) | 2020.11.18 |
[2020-2학기 C과제 6주차] (0) | 2020.11.07 |
[2020-2학기 C과제 4주차] (0) | 2020.10.02 |
[2020-2학기 C과제 3주차] (0) | 2020.09.21 |