문제

경상북도 특산품인 사과를 학생들에게 나눠주기 위해 여러 학교에 사과를 배정하였다. 배정된 사과 개수는 학교마다 다를 수 있고, 학생 수도 학교마다 다를 수 있다. 각 학교에서는 배정된 사과를 모든 학생들에게 똑같이 나눠주되, 남는 사과의 개수를 최소로 하려고 한다. (서로 다른 학교에 속한 학생이 받는 사과 개수는 다를 수 있다.)

예를 들어, 5개 학교의 학생 수와 배정된 사과 수가 다음과 같다고 하자.

학교 A B C D E
학생 수 24 13 5 23 7
사과 개수 52 22 53 10 70

A 학교에서는 모든 학생에게 사과를 두 개씩 나눠주고 4개의 사과가 남게 된다. B 학교에서는 모든 학생에게 사과를 한 개씩 나눠주고 9개의 사과가 남게 된다. 비슷하게 C 학교에서는 3개의 사과가, D 학교에서는 10개의 사과가, E 학교에서는 0개의 사과가 남게 되어, 남는 사과의 총 수는 4+9+3+10+0 = 26이다. 

각 학교의 학생 수와 사과 개수가 주어졌을 때, 학생들에게 나눠주고 남는 사과의 총 개수를 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에는 학교의 수를 나타내는 정수 N (1 ≤ N ≤ 100)이 주어진다. 다음 N 개의 줄에 각 학교의 학생 수와 배정된 사과 개수를 나타내는 두 개의 정수가 주어진다. 학생 수와 사과 개수는 모두 1이상 100이하이다. 

출력

남은 사과의 총 개수를 나타내는 정수를 출력한다.

예제 입력 1

5
24 52
13 22
5 53
23 10
7 70

예제 출력 1

26

예제 입력 2

3
10 20
5 5
1 13

예제 출력 2

0

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N, student, apple, sum=0;

	scanf("%d", &N);

	for(int n=0;n<N;n++)
	{
		scanf("%d %d", &student, &apple);
		sum+=apple%student;
	}

	printf("%d\n", sum);
	return 0;
}
728x90

문제

세연이네 학교 운동장은 아래와 같다.

위의 그림에서 영역 A와 B는 반원이며, 영역 C는 직사각형이다. 영역 C의 가로의 길이를 d1, 영역 A의 반지름의 길이 d2의 값이 주어지면 운동장의 한 바퀴 둘레를 알아내는 프로그램을 작성하시오. (단, 이 문제에서는 π (원주율)의 값을 3.141592라고 한다.)

입력

첫째 줄에 d1의 값이 주어진다. 둘째 줄에는 d2의 값이 주어진다. (d1, d2의 값은 100,000 이하의 양의 정수)

출력

첫째 줄에 문제에서 요구하는 정답을 출력한다. 절대/상대 오차는 10-6 까지 허용한다.

예제 입력 1

13
8

예제 출력 1

76.265472

더보기

Solution

#include<stdio.h>

int main(void)
{
	int d1, d2;

	scanf("%d", &d1);
	scanf("%d", &d2);

	printf("%lf\n", (double)2*(3.141592*d2+d1));
	return 0;
}
728x90

문제

신원이는 백준에서 배수에 관한 문제를 풀다가 감명을 받아 새로운 문제를 만들어보았다. 자연수 N과 M개의 자연수 Ki가 주어진다. Ki중 적어도 하나의 배수이면서 1 이상 N 이하인 수의 합을 구하여라.

입력

첫 번째 줄에 N과 M가 주어진다. (2 ≤ N ≤ 1000, 1 ≤ M < N)

그다음 줄에 M개의 정수 Ki가 주어진다. (2 ≤ Ki ≤ 1000)

동일한 Ki는 주어지지 않으며, 오름차순으로 정렬되어있다.

출력

배수들의 합을 출력한다.

예제 입력 1

10 2
2 3

예제 출력 1

42

예제 입력 2

1000 3
3 5 7

예제 출력 2

272066

더보기

Solution

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

int main(void)
{
	int N, M, *K=NULL, sum=0;

	scanf("%d %d", &N, &M);
	K=(int *)malloc(M*sizeof(int));

	for(int i=0;i<M;i++)
		scanf("%d", &K[i]);

	for(int i=K[0];i<=N;i++)
	{
		bool multiple=false;

		for(int j=0;j<M;j++)
			if(i>=K[j] && i%K[j]==0)
			{
				multiple=true;
				break;
			}

		if(multiple)
			sum+=i;
	}

	printf("%d\n", sum);
	free(K);
	return 0;
}
728x90

문제

배틀그라운드라는 게임에서는 머리와 몸을 보호하기 위해 헬멧과 조끼를 입는다. 

맵에는 다양한 헬멧과 조끼가 있으며 각각 방어력을 갖고 있다. 또한 최대 1개의 헬멧과 조끼밖에 입지 못한다. 경수는 배틀그라운드에서 승리하고 싶기 때문에 시간이 걸리더라도 최고의 헬멧과 조끼를 주워서 최대의 방어력을 얻고 싶어한다.

맵에 존재하는 조끼와 헬멧의 방어력이 주어졌을 때 경수를 도와 경수가 얻을 수 있는 방어력의 최댓값을 구해주자.

입력

입력의 첫째 줄에 맵에 존재하는 헬멧의 개수 N(N은 1000이하의 자연수)과 조끼의 개수 M(M은 1000이하의 자연수)이 주어진다. 둘째 줄에 각 헬멧의 방어력 h[i] (h[i]는 10억 이하의 자연수)가 N개 만큼 주어지며, 셋째 줄에 각 조끼의 방어력 a[i] (a[i]는 10억 이하의 자연수)가 M개 만큼 주어진다.

출력

경수가 얻을 수 있는 방어력의 최댓값을 출력한다.

예제 입력 1

5 7
10 60 15 20 7
1 2 3 7 5 1 3

예제 출력 1

67

예제 입력 2

2 3
1 1000000000
20 18 1000000000

예제 출력 2

2000000000

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N, M, a, max_a=0, h, max_h=0;;

	scanf("%d %d", &N, &M);

	for(int n=0;n<N;n++)
	{
		scanf("%d", &h);
		max_h=h>max_h?h:max_h;
	}
	for(int m=0;m<M;m++)
	{
		scanf("%d", &a);
		max_a=a>max_a?a:max_a;
	}

	printf("%d\n", max_h+max_a);
	return 0;
}
728x90

문제

원섭이는 잉글랜드 4부리그 풋볼 리그 2에서 활약하는 AFC 윔블던을 좋아한다. 이 팀은 2002년 윔블던 FC가 밀턴 킨스로 연고 이전을 감행하자 윔블던의 서포터들이 스스로 나서 창단한 팀이다. 윔블던 FC는 1988년에 당시 최고의 팀인 리버풀을 꺾고 FA컵을 우승하면서 엄청난 활약을 했었다. 하지만 1989년 4월 15일 축구역사상 최대 비극적인 사건 중 하나인 힐스보로 참사가 발생하였고, 1990년 1월 테일러 리포트가 발표되었다. 1991년, 상위권 리그 팀은 반드시 홈 경기장을 좌석제로 바꿔야 한다는 테일러 리포트의 내용에 따라 윔블던은 홈 구장이었던 플로 레인을 떠나게 되었다. 이때부터 10년동안 임시로 근처 클럽이었던 크리스털 팰리스와 경기장을 공유하기 시작했고 점점 재정적인 어려움을 겪었다. 결국 2002년 윔블던에서 약 90km정도 떨어진 밀턴 킨스로 연고지를 이전하는 초유의 사태가 벌어졌으며, 2004년 윔블던 FC는 파산하게 된다. 윙클만은 클럽을 산 뒤, 7월 클럽의 이름을 밀턴 킨스 돈스 FC(이하 MK 돈스)로 바꾼다.

한국에서 이 소식을 들은 원섭이는 엄청난 분노하였고, 어서 빨리 MK 돈스를 경기장에서 이기는 모습을 보고싶어했다.

하지만, MK 돈스는 2004년 3부리그에 참가했지만, 그 때 AFC 윔블던은 8부리그에 참가하고 있었다. 두 팀이 공식 경기에서 만나려면 FA Cup밖에 기회가 없었다. 하지만, FA Cup은 하부 리그 팀은 낮은 라운드부터 대회에 참가하고, 대진은 추첨이므로 두 팀이 만나는 것은 불가능하다 생각했다.

AFC 윔블던은 2002년 클럽의 역사를 9부리그에서 시작했지만, 2004년 8부리그, 2005년 7부리그, 2008년 6부리그, 2009년 5부리그로 점점 승격하였다. 그리고 2011년, 창단 9년만에 AFC 윔블던은 4부리그(리그2)에 승격하였다.

MK 돈스는 2004년부터 2시즌(06-07, 07-08)을 제외하고는 항상 3부리그에서 활동했다. 이제 MK 돈스가 강등당하거나 AFC 윔블던이 승격을 하면 리그에서 두 팀간의 경기를 볼 수 있다.

2012년 12월 2일. 불가능할 것 같았던 사건이 일어났다. 2012-13 FA Cup 2라운드 에서 두 팀이 맞붙게 된 것이었다. 어서 빨리 이 경기를 보고 싶었던 원섭이는 FA Cup을 중계해주는 SBS ESPN의 편성표를 검색해보았다. 하지만, 두 팀간의 경기는 한국인에게 별로 관심을 끌지 못하는 경기였기 때문에, 중계가 예정되어 있지 않았다.

원섭이는 잉글랜드에 거주하는 지수에게 경기 결과를 물어봤다. 지수는 축구에는 큰 관심이 없지만 원섭이를 괴롭히는 것을 좋아하는 친구다. 지수는 두 팀의 최종 점수를 알려주는 대신, 두 팀이 득점한 점수의 합과 차를 알려주었다.

MK 돈스와 AFC 윔블던의 점수의 합과 차가 주어졌을 때, 최종 점수를 구하는 프로그램을 작성하시오.

참고로 우리나라도 비슷한 경우가 있다. 2007년 부천 SK의 제주 연고지 이전을 반대하던 서포터들은 부천FC 1995를 창단했다. 이 팀은 2013년부터 K리그에 참가한다. 또, AFC 윔블던과 자매 결연 관계를 맺고 있다.

입력

첫째 줄에 두 팀 점수의 합과 차가 빈 칸으로 구분되어 주어진다. 축구 점수는 항상 음이 아닌 정수이고, 합과 차는 1000보다 작거나 같은 음이 아닌 정수이다.

출력

첫째 줄에 두 팀의 경기 결과를 출력한다. 득점을 많이 한 쪽을 먼저 출력한다. 만약, 그러한 합과 차를 갖는 경기 결과가 없다면, -1을 출력한다.

예제 입력 1

3 1

예제 출력 1

2 1

힌트

MK 돈스 vs AFC 윔블던 FA Cup 2라운드 하이라이트 영상


더보기

Solution

#include<stdio.h>
#include<stdbool.h>

int main(void)
{
	int sum, sub;
	bool found=false;

	scanf("%d %d", &sum, &sub);

	for(int MK=0;MK<=sum;MK++)
		if(2*MK-sub==sum)
		{
			printf("%d %d\n", MK, MK-sub);
			found=true;
			break;
		}

	if(!found)
		printf("-1\n");
	return 0;
}
728x90

문제

백준대학교에서는 대회에 나갈 때 2명의 여학생과 1명의 남학생이 팀을 결성해서 나가는 것이 원칙이다. (왜인지는 총장님께 여쭈어보는 것이 좋겠다.)

백준대학교는 뛰어난 인재들이 많아 올해에도 N명의 여학생과 M명의 남학생이 팀원을 찾고 있다. 대회에 참여하려는 학생들 중 K명은 반드시 인턴쉽 프로그램에 참여해야 한다. 인턴쉽에 참여하는 학생은 대회에 참여하지 못한다.

백준대학교에서는 뛰어난 인재들이 많기 때문에, 많은 팀을 만드는 것이 최선이다.

여러분은 여학생의 수 N, 남학생의 수 M, 인턴쉽에 참여해야하는 인원 K가 주어질 때 만들 수 있는 최대의 팀 수를 구하면 된다.

입력

첫째 줄에 N, M, K가 순서대로 주어진다. (0 ≤ M ≤ 100, 0 ≤ N ≤ 100, 0 ≤ K ≤ M+N),

출력

만들 수 있는 팀의 최대 개수을 출력하면 된다.

예제 입력 1

6 3 2

예제 출력 1

2

더보기

Solution

#include<stdio.h>

int main(void)
{
	int M, N, K, count=0;

	scanf("%d %d %d", &N, &M, &K);

	while(N+M-3*count>=K && M>=count && N>=2*count)
		count++;

	printf("%d\n", count-1);
	return 0;
}

 

728x90

문제

정수 N이 주어져 있을 때 이 수가 10보다 크면 일의 자리에서 반올림을 하고, 이 결과가 100보다 크면 다시 10의 자리에서 반올림을 하고, 또 이 수가 1000보다 크면 100의 자리에서 반올림을 하고.. (이하 생략) 이러한 연산을 한 결과를 출력하시오.

입력

첫째 줄에 정수 N이 주어진다. (0 ≤ N ≤ 99,999,999)

출력

첫째 줄에 위와 같은 연산을 한 결과를 출력하시오.

예제 입력 1

15

예제 출력 1

20

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N, count=0;

	scanf("%d", &N);

	while(N/10>0)
	{
		if((N%10)>4)
			N+=10;

		N/=10;
		count++;
	}

	for(int i=0;i<count;i++)
		N*=10;

	printf("%d\n", N);
	return 0;
}
728x90

문제

준규는 집을 짓고 있다. 준규는 모든 벽 모양을 직각 삼각형으로 만들려고 한다. 적절히 나무를 잘라 삼각형을 만들었지만, 준규는 각도를 측정할 수 있는 도구를 가지고 있지 않다. 어쩔 수 없이 줄자를 이용해 삼각형 세 변의 길이를 측정한 다음, 직각 삼각형인지 아닌지를 알아보려고 한다.

삼각형 세 변의 길이가 주어졌을 때, 직각 삼각형인지 아닌지를 구하는 프로그램을 작성하시오.

입력

입력의 첫째 줄에는 테스트 케이스의 개수 n이 주어진다. 각 테스트 케이스는 세 정수 1 ≤ a, b, c ≤ 40000 으로 이루어져 있다. 세 정수는 삼각형 각 변의 길이를 나타낸다.

출력

각 테스트 케이스마다 "Scenario #i:"를 출력한다. i는 테스트 케이스 번호이며, 1부터 시작한다. 그 다음 줄에는 입력으로 주어진 삼각형이 직각 삼각형인 경우에는 "yes", 아닌 경우에는 "no"를 출력한다. 각 테스트 케이스 사이에는 빈 줄을 하나 출력한다.

예제 입력 1

2
36 77 85
40 55 69

예제 출력 1

Scenario #1:
yes

Scenario #2:
no

더보기

Solution

#include<stdio.h>

int main(void)
{
	int n, a, b, c;

	scanf("%d", &n);

	for(int i=1;i<=n;i++)
	{
		scanf("%d %d %d", &a, &b, &c);

		if(a>b)
		{
			int d=a;
			a=b;
			b=d;
		}
		if(a>c)
		{
			int d=a;
			a=c;
			c=d;
		}
		if(b>c)
		{
			int d=b;
			b=c;
			c=d;
		}

		printf("Scenario #%d:\n%s\n\n", i, a*a+b*b==c*c?"yes":"no");
	}

	return 0;
}
728x90

+ Recent posts