혜랑's STORY

[2020-2학기 C언어 7주차] 본문

2020 SISS 21기 활동/2학기 C언어

[2020-2학기 C언어 7주차]

hyerang0125 2020. 11. 9. 02:13

#SWEA 8888 : 시험

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 8888번 실행결과

 

#SWEA 8457번 : 알 덴테 스파게티

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;
}

 

- 실행결과

SWEA 8457번 실행결과

 

'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