문제

5학년은 다니기 싫은 아리는 4학년까지 졸업 학점을 채워 졸업할 수 있는지 궁금해졌다. 아리가 졸업하려면 총 130학점 이상 들어야 하고, 그중 66학점 이상은 전공학점이어야 한다. 아리는 현재 2021년 2학기까지 N학기를 마쳤고, 전공학점 A를 포함하여 총 B학점을 이수하였다. 고민하던 아리는 학교 홈페이지에서 다음과 같은 공지가 올라온 것을 확인했다.

 

2022년 1학기부터 2026년 2학기까지 10개의 학기 동안 개설되는 과목의 수를 공지합니다.
2022년 1학기 : 전공과목 X1개, 비전공 과목 Y1개2022년 2학기 : 전공과목 X2개, 비전공 과목 Y2개2023년 1학기 : 전공과목 X3개, 비전공 과목 Y3개
                                            ⋮
2026년 2학기 : 전공과목 X10개, 비전공 과목 Y10개
2022년 1학기부터는 한 학기에 전공 수업과 비전공 수업을 포함하여 최대 6과목을 수강할 수 있습니다.
한 과목을 수강하게 되면 3학점을 얻게 되고, 그러므로 한 학기에 최대 18학점을 이수할 수 있습니다. 참고하시기 바랍니다.

 

각 수업은 시간표가 서로 겹치지 않아서 아리는 원하는 수업을 모두 수강할 수 있다. 아리는 최대한 빨리 졸업을 하고 싶어서 휴학을 하지 않는다. 아리를 도와 아리가 전에 마쳤던 학기를 포함하여 총 8학기 안에 졸업할 수 있는지 확인하는 프로그램을 작성해보자.

 

 

조건 및 입출력

- 세 정수 N(1 ≤ N ≤ 7), A(1 ≤ A ≤ 150), B(A ≤ B ≤ 150)이 주어진다.

다음 10개 줄에는 2022년 1학기부터 2026년 2학기까지 차례대로 학기에 개설되는 과목의 수가 주어지고, 한 줄에 한 학기의 전공과목 수 X(1 ≤ X ≤ 6), 비전공 과목 수 Y(1≤ Y ≤ 6)이 주어진다.

- 총 8학기 안에 졸업 조건을 맞출 수 있다면 "Nice"를, 불가능하다면 "Nae ga wae"를 출력한다.

- 시간 제한: 1초  / 메모리 제한: 512MB

 

 

코드 (C99)
#include <stdio.h>

main()
{
	int term, major_credit, all_credit;
	scanf("%d %d %d", &term, &major_credit, &all_credit);

	for (int i = 0; i < 8 - term; i++)
	{
		int major, select;
		scanf("%d %d", &major, &select);

		major_credit += major * 3;
		all_credit += (major + select) * 3;
		
		if (major + select > 6)
			all_credit -= 3 * (major + select - 6);
	}

	if (all_credit >= 130 && major_credit >= 66)
		printf("Nice");
	else
		printf("Nae ga wae");

	return 0;
}

 

 


여담

아침이라 그런지, 머리가 잘 안 돌아가는 느낌이다.

 

내가 생각한 구현 방법은 다음과 같다.

전공 학점부터 채우고, 그 다음 교양을 들으면 된다는 청사진을 준비하고 코드를 작성했다.

전공 학점은 전공 & 총 학점도 올라가지만, 교양은 총 학점만 올라가기 때문이다.

 

전체 8학기(4년제 * 2학기)  중 이수학기를 제외한 나머지 학기 동안 루프를 돈다.

우선 전공부터 수강하고, 교양을 수강한다.

 

최대 6과목을 수강할 수 있으므로, 6과목 중 전공을 제외하고 남은 과목 수 만큼 교양을 수강한다.

 

그렇게 해서 전공 66, 총 학점 130이 넘으면 무사히 졸업할 수 있고,

그렇지 않다면 5학년을 다녀야 할 것이다.

 

코드가 이상하거나, 이해되지 않는 부분이 있다면 댓글 남겨주세요!

+ 더 좋은 풀이 방법이 있다면 알려주세요 :)

 

 

+ Recent posts