문제

승택이의 아들이 생일을 맞았다. 승택이는 아들을 위해 생일 파티를 하려고 한다.

하지만 아들의 친구들을 모두 초대할 수는 없다. 아이들에게 나눠 줄 사탕이 부족하기 때문이다.

아이들은 항상 한 종류의 사탕만을 먹고 싶어한다. 게다가, 한 종류의 사탕을 최소한 K개 이상 먹어야만 행복해한다.

K가 주어지고 승택이가 현재 갖고 있는 사탕의 종류와 개수가 주어진다. 이때, 생일파티에 올 수 있는 아이들은 최대 몇 명일까?

입력

첫 줄에 테스트 케이스의 수 T가 주어진다. ( 1 ≤ T ≤ 100 )

각 테스트 케이스의 첫 줄엔 승택이가 갖고 있는 사탕의 종류의 수 N과 K가 주어진다. ( 1 ≤ N, K ≤ 100 )

두 번째 줄엔 N개의 정수로 승택이가 각 종류의 사탕을 몇 개 갖고 있는지가 주어진다.

모든 종류에 대해, 사탕은 최소 1개 최대 100개이다.

출력

각 테스트 케이스마다 생일파티에 최대 몇 명의 아이들이 참석할 수 있는지 하나의 정수로 출력한다.

예제 입력 1

2
3 2
4 5 7
3 8
4 5 7

예제 출력 1

7
0

더보기

Solution

#include<stdio.h>

int main(void)
{
	int T;

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		int N, K, max=0, candy;

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

		for(int i=0;i<N;i++)
		{
			scanf("%d", &candy);
			max+=candy/K;
		}

		printf("%d\n", max);
	}

	return 0;
}
728x90

문제

이 사진을 기억하는가?

이 사진은 오래전부터 인터넷에 돌아다니는 사진으로, 작년 전대프연 예선 A번에서는 수학을 정말 못 하는 고등학생인 성원이의 시험지로 소개되었다. 저작권이 있는 사진일 수 있어 알아보기 어렵게 가공했음을 양해 바란다.

예선 날짜가 다가오는데도 적당한 A번 문제를 생각하지 못한 출제진은 작년 전대프연 예선 A번을 응용해서 문제를 만들기로 했다. 이를 위해 사진 속 문제를 찾아본 출제진은 해당 문제가 2007학년도 6월 고등학교 1학년 전국연합학력평가 수리 영역 26번임을 알게 되었다.

시험지를 내려받고 문제들을 살펴보던 출제진은 아래와 같은 문제를 발견했다.

예상했겠지만, 여러분은 이제 위의 19번 문제 세 번째 줄에 등장하는 수 '1000'을 임의의 자연수로 바꾸었을 때 그에 해당하는 답을 출력하는 프로그램을 작성해야 한다.

입력

첫 번째 줄에 자연수 n (1 ≤ n ≤ 10^9)이 주어진다.

출력

첫 번째 줄에 19번 문제 세 번째 줄에 등장하는 수 '1000'을 자연수 n으로 바꾸었을 때 그에 해당하는 답의 번호를 출력한다. 즉, 1 이상 5 이하의 자연수 중 하나를 출력해야 한다.

예제 입력 1

3

예제 출력 1

3

예제 입력 2

1000

예제 출력 2

2

더보기

Solution

#include<stdio.h>

int main(void)
{
	int n;

	scanf("%d", &n);

	switch(n%8)
	{
		case 1:
				printf("1\n");
				break;
		case 2:
		case 0:
				printf("2\n");
				break;
		case 3:
		case 7:
				printf("3\n");
				break;
		case 4:
		case 6:
				printf("4\n");
				break;
		case 5:
				printf("5\n");
				break;
	}
	return 0;
}
728x90

문제

두 정수 a와 b 최소공배수는 두 수의 공통된 배수 중 가장 작은 수이고, 최대공약수는 두 수의 공통된 약수중 가장 큰 수이다.

a와 b가 주어졌을 때, 최소공배수와 최대공약수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T(1<=T<=1,000)가 주어진다. 각 테스트 케이스는 두 정수 a와 b로 이루어져 있고, 공백으로 구분되어 있다. (1 <= a,b <= 1,000)

출력

각 테스트 케이스에 대해 최소공배수와 최대공약수를 차례대로 출력한다.

예제 입력 1

3
5 10
7 23
42 56

예제 출력 1

10 5
161 1
168 14

더보기

Solution

#include<stdio.h>

int gcd(int x,int y)
{
	if(x<y)
	{
		int temp=x;
		x=y;
		y=temp;
	}

	while(y!=0)
	{
		int temp=x%y;
		x=y;
		y=temp;
	}

	return x;
}

int main(void)
{
	int T, a, b, gcd_ab;

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		scanf("%d %d", &a, &b);

		gcd_ab=gcd(a,b);
		printf("%d %d\n", a*b/gcd_ab, gcd_ab);
	}

	return 0;
}
728x90

문제

할로윈데이에 한신이네는 아부지가 사탕을 나눠주신다. 하지만 한신이의 형제들은 서로 사이가 좋지않아 서른이 넘어서도 사탕을 공정하게 나누어 주지 않으면 서로 싸움이 난다. 매년 할로윈데이때마다 아부지는 사탕을 자식들에게 최대한 많은 사탕을 나누어 주시기 원하며 자신에게는 몇개가 남게되는지에 알고 싶어 하신다. 이런 아부지를 도와서 형제간의 싸움을 막아보자.

입력

가장 첫 번째 줄에는 테스트 케이스의 수가 입력되고, 각 테스트 케이스마다 사탕의 개수와 형제의 수가 차례대로 입력된다.

출력

출력은 예제를 보고 ”You get __ piece(s) and your dad gets __ piece(s).” 형식에 맞추어 적절하게 출력하라.

예제 입력 1

5
22 3
15 5
99 8
7 4
101 5

예제 출력 1

You get 7 piece(s) and your dad gets 1 piece(s).
You get 3 piece(s) and your dad gets 0 piece(s).
You get 12 piece(s) and your dad gets 3 piece(s).
You get 1 piece(s) and your dad gets 3 piece(s).
You get 20 piece(s) and your dad gets 1 piece(s).

더보기

Solution

#include<stdio.h>

int main(void)
{
	int T, candy, children;

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		scanf("%d %d", &candy, &children);
		printf("You get %d piece(s) and your dad gets %d piece(s).\n", candy/children, candy%children);
	}

	return 0;
}
728x90

문제

상근이는 망가진 전투 드로이드를 고치려고 하고 있다. 전투 드로이드의 각 부품의 가격은 다음과 같다.

블래스터 라이플 $350.34
시각 센서 $230.90
청각 센서 $190.55
$125.30
다리 $180.90

입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 음이 아닌 정수 다섯 개(A B C D E)로 이루어져 있다.

  • A: 필요한 블래스터 라이플의 개수
  • B: 필요한 시각 센서의 개수
  • C: 필요한 청각 센서의 개수
  • D: 필요한 팔의 수
  • E: 필요한 다리의 수

출력

각 테스트 케이스 마다, 입력으로 주어진 부품을 모두 구매하는데 필요한 비용을 소수점 둘째 자리까지 출력한다. 달러 표시도 출력해야 한다. 정답은 1억보다 작거나 같다.

예제 입력 1

3
20 10 14 3 9
19 17 12 8 10
11 9 8 22 33

예제 출력 1

$13987.50
$15679.76
$16182.54

더보기

Solution

#include<stdio.h>

int main(void)
{
	float price[5]={350.34, 230.9, 190.55, 125.3, 180.9};
	int T;

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		int need;
		float total=0.0;

		for(int i=0;i<5;i++)
		{
			scanf("%d", &need);
			total+=price[i]*need;
		}

		printf("$%.2f\n", total);
	}

	return 0;
}
728x90

문제

유명 편의점 체인점 세븐25는 삼각 김밥을 전국에서 가장 싸게 판매하고 있다. 

이 회사의 직원들은 삼각 김밥의 가격을 전국 최저가를 유지하기 위해 매일 근처의 편의점을 방문한다. 그리고 나서 세븐25의 삼각 김밥보다 싼 가격을 발견하면, 삼각 김밥의 가격을 그 가격으로 바꿔 최저가를 유지한다.

매일 아침, 점심, 저녁으로 삼각 김밥을 먹는 상근이와 정인이는 정말 세븐25가 제일 싼지 궁금해졌다. 

이들은 학교 근처에 있는 세븐 25와 세븐 25를 제외한 서로 다른 N개의 편의점 체인을 방문 할 것이다. 이 편의점을 방문하면서 세븐25보다 싼 삼각김밥을 찾을 것이다. 또, 전체 편의점에서 가장 싼 삼각 김밥은 어디인지 찾을 것이다.

어느 편의점의 삼각 김밥이 제일 싼지 고객들이 쉽게 알지 못하기 하기 위해서, 모든 편의점은 삼각 김밥의 가격을 다음과 같이 표시한다. "삼각 김밥 Y그램 당 X원"

상근이와 정인이는 삼각 김밥을 1,000그램 살 것이다.

세븐 25의 삼각 김밥 가격과, 다른 N개 편의점의 삼각 김밥 가격이 주어졌을 때, 1,000그램의 삼각 김밥을 가장 싸게 사려면 얼마면 되는지 구하는 프로그램을 작성하시오.

삼각 김밥은 여러 군데에서 돌아가면서 사도 되고, 세븐 25와 N개 편의점 이외의 다른 곳에서는 살 수 없다.

입력

첫째 줄에 세븐25의 삼각 김밥 가격 정보 X와 Y가 주어진다. (Y그램 당 X원) (1 ≤ X ≤ 100, 1 ≤ Y ≤ 1,000)

둘째 줄에는 세븐25를 제외한 편의점의 개수 N이 주어진다. (1 ≤ N ≤ 100)

다음 N개의 줄에는 i번째 편의점의 삼각 김밥 가격 정보 Xi와 Yi가 주어진다. (Yi그램 당 Xi원) (1 ≤ Xi ≤ 100, 1 ≤ Yi ≤ 1,000)

출력

첫째 줄에 삼각 김밥 1,000그램 가격의 최저가를 출력한다. 정답과의 오차는 0.01까지 허용한다.

예제 입력 1

5 100
3
4 100
3 100
7 100

예제 출력 1

30.00

더보기

Solution

#include<stdio.h>

int main(void)
{
	float cheap;
	int N, X, Y;

	scanf("%d %d", &X, &Y);
	cheap=X*(1000.0/Y);
	scanf("%d", &N);

	for(int n=0;n<N;n++)
	{
		scanf("%d %d", &X, &Y);
		cheap=X*(1000.0/Y)<cheap?X*(1000.0/Y):cheap;
	}

	printf("%.2f\n", cheap);
	return 0;
}
728x90

문제

상근이는 변의 길이가 1인 정사각형 n개를 가지고 있다. 이 정사각형을 이용해서 만들 수 있는 직사각형의 개수는 총 몇 개일까?

두 직사각형 A와 B가 있을 때, A를 이동, 회전시켜서 B를 만들 수 없으면, 두 직사각형은 다르다고 한다. 직사각형을 만들 때, 정사각형을 변형시키거나, 한 정사각형 위에 다른 정사각형을 놓을 수 없다. 또, 직사각형은 정사각형으로 꽉 차있어야 한다.

입력

첫째 줄에 n (1 ≤ n ≤ 10,000)이 주어진다.

출력

만들 수 있는 직사각형의 개수를 출력한다.

예제 입력 1

6

예제 출력 1

8

힌트


더보기

Solution

#include<stdio.h>

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

	scanf("%d", &n);

	for(int i=1;i<=n;i++)
		for(int j=1;j<=i && i*j<=n;j++)
			count+=i*j<=n;

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

문제

2차원 좌표 상의 여러 점의 좌표 (x,y)가 주어졌을 때, 각 사분면과 축에 점이 몇 개 있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 점의 개수 n (1 ≤ n ≤ 1000)이 주어진다. 다음 n개 줄에는 점의 좌표 (xi, yi)가 주어진다. (-10^6 ≤ xi, yi ≤ 10^6)

출력

각 사분면과 축에 점이 몇 개 있는지를 예제 출력과 같은 형식으로 출력한다.

예제 입력 1

5
0 0
0 1
1 1
3 -3
2 2

예제 출력 1

Q1: 2
Q2: 0
Q3: 0
Q4: 1
AXIS: 2

더보기

Solution

#include<stdio.h>

int main(void)
{
	int n, x, y, Q[5]={0, };

	scanf("%d", &n);

	for(int i=0;i<n;i++)
	{
		scanf("%d %d", &x, &y);

		if(x==0 || y==0)
			Q[0]++;
		else if(x>0 && y>0)
			Q[1]++;
		else if(x<0 && y>0)
			Q[2]++;
		else if(x<0 && y<0)
			Q[3]++;
		else
			Q[4]++;
	}

	for(int i=1;i<=4;i++)
		printf("Q%d: %d\n", i, Q[i]);
	printf("AXIS: %d\n", Q[0]);
	return 0;
}
728x90

+ Recent posts