문제

등산가 김강산은 가족들과 함께 캠핑을 떠났다. 하지만, 캠핑장에는 다음과 같은 경고문이 쓰여 있었다.

캠핑장은 연속하는 20일 중 10일동안만 사용할 수 있습니다.

강산이는 이제 막 28일 휴가를 시작했다. 이번 휴가 기간 동안 강산이는 캠핑장을 며칠동안 사용할 수 있을까?

강산이는 조금 더 일반화해서 문제를 풀려고 한다. 

캠핑장을 연속하는 P일 중, L일동안만 사용할 수 있다. 강산이는 이제 막 V일짜리 휴가를 시작했다. 강산이가 캠핑장을 최대 며칠동안 사용할 수 있을까? (1 < L < P < V)

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, L, P, V를 순서대로 포함하고 있다. 모든 입력 정수는 int범위이다. 마지막 줄에는 0이 3개 주어진다.

출력

각 테스트 케이스에 대해서, 강산이가 캠핑장을 최대 며칠동안 사용할 수 있는지 예제 출력처럼 출력한다.

예제 입력 1

5 8 20
5 8 17
0 0 0

예제 출력 1

Case 1: 14
Case 2: 11

더보기

Solution

#include<stdio.h>

int main(void)
{
	int L, P, V;

	scanf("%d %d %d", &L, &P, &V);
	for(int i=1;L!=0||P!=0||V!=0;i++)
	{
		printf("Case %d: %d\n", i, V%P>=L?L*(V/P)+L:L*(V/P)+V%P);
		scanf("%d %d %d", &L, &P, &V);
	}

	return 0;
}
728x90

문제

수업 시간에 떠드는 두 학생이 있다. 두 학생은 수업에 집중하는 대신에 글로벌 경제 위기에 대해서 토론하고 있었다. 토론이 점점 과열되면서 두 학생은 목소리를 높였고, 결국 선생님은 크게 분노하였다.

이렇게 학생들이 수업 시간에 떠드는 문제는 어떻게 해결해야 할까?

얼마전에 초등학교 선생님으로 취직한 상근이는 이 문제를 수학 문제로 해결한다. 학생들을 진정시키기 위해 칠판에 수학 문제를 써주고, 아이들에게 조용히 이 문제를 풀게 한다. 학생들이 문제를 금방 풀고 다시 떠드는 것을 방지하기 위해서, 숫자를 매우 크게 한다.

아직 초등학교이기 때문에, 학생들은 덧셈과 곱셈만 배웠다. 또, 아직 10의 제곱꼴을 제외한 다른 수는 학교에서 배우지 않았기 때문에, 선생님이 써주는 수는 모두 10의 제곱 형태이다.

쉬는 시간까지 문제를 푸는 것을 막기 위해서, 선생님이 써주는 숫자는 최대 100자리이다.

칠판에 쓰여 있는 문제가 주어졌을 때, 결과를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 양의 정수 A가 주어진다.

둘째 줄에 연산자 + 또는 *가 주어진다.

셋째 줄에 양의 정수 B가 주어진다.

A와 B는 모두 10의 제곱 형태이고, 길이는 최대 100자리이다.

출력

첫째 줄에 결과를 출력한다. 결과는 A+B 또는 A*B이며, 입력에서 주어지는 연산자에 의해 결정된다. 

예제 입력 1

1000
*
100

예제 출력 1

100000

더보기

Solution

#include<stdio.h>
#include<string.h>

int main(void)
{
	char c, number[101]={'\0', };
	int A, B;

	scanf("%s", number);
	A=strlen(number);
	getchar();
	scanf("%c", &c);
	scanf("%s", number);
	B=strlen(number);

	if(c=='*')
	{
		printf("1");
		for(int i=0;i<A+B-2;i++)
			printf("0");
		printf("\n");
	}
	else
	{
		if(A==B)
		{
			printf("2");
			for(int i=0;i<A-1;i++)
				printf("0");
		}
		else
		{
			if(A<B)
			{
				int temp=A;
				A=B;
				B=temp;
			}

			printf("1");
			for(int i=0;i<A-1;i++)
				printf("%d", A-i-1==B?1:0);
		}
		printf("\n");
	}

	return 0;
}
728x90

문제

정화는 N×M 크기의 초콜릿을 하나 가지고 있다. 초콜릿은 금이 가 있는 모양을 하고 있으며, 그 금에 의해 N×M개의 조각으로 나눠질 수 있다.

초콜릿의 크기가 너무 크다고 생각한 그녀는 초콜릿을 친구들과 나눠 먹기로 했다. 이를 위해서 정화는 초콜릿을 계속 쪼개서 총 N×M개의 조각으로 쪼개려고 한다. 초콜릿을 쪼갤 때에는 초콜릿 조각을 하나 들고, 적당한 위치에서 초콜릿을 쪼갠다. 초콜릿을 쪼갤 때에는 금이 가 있는 위치에서만 쪼갤 수 있다. 이와 같이 초콜릿을 쪼개면 초콜릿은 두 개의 조각으로 나눠지게 된다. 이제 다시 이 중에서 초콜릿 조각을 하나 들고, 쪼개는 과정을 반복하면 된다.

초콜릿을 쪼개다보면 초콜릿이 녹을 수 있기 때문에, 정화는 가급적이면 초콜릿을 쪼개는 횟수를 최소로 하려 한다. 초콜릿의 크기가 주어졌을 때, 이를 1×1 크기의 초콜릿으로 쪼개기 위한 최소 쪼개기 횟수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 두 정수 N, M(1≤N, M≤300)이 주어진다.

출력

첫째 줄에 답을 출력한다.

예제 입력 1

2 2

예제 출력 1

3

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N, M;

	scanf("%d %d", &M, &N);
	printf("%d\n", N*M-1);
	return 0;
}
728x90

문제

평면에 네 개의 직사각형이 놓여 있는데 그 밑변은 모두 가로축에 평행하다. 이 네 개의 직사각형들은 서로 떨어져 있을 수도 있고, 겹쳐 있을 수도 있고, 하나가 다른 하나를 포함할 수도 있으며, 변이나 꼭짓점이 겹칠 수도 있다.

이 직사각형들이 차지하는 면적을 구하는 프로그램을 작성하시오.

입력

입력은 네 줄이며, 각 줄은 직사각형의 위치를 나타내는 네 개의 정수로 주어진다. 첫 번째와 두 번째의 정수는 사각형의 왼쪽 아래 꼭짓점의 x좌표, y좌표이고 세 번째와 네 번째의 정수는 사각형의 오른쪽 위 꼭짓점의 x좌표, y좌표이다. 모든 x좌표와 y좌표는 1이상이고 100이하인 정수이다.

출력

첫 줄에 네개의 직사각형이 차지하는 면적을 출력한다.

예제 입력 1

1 2 4 4
2 3 5 7
3 1 6 5
7 3 8 6

예제 출력 1

26

더보기

Solution

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

int main(void)
{
	bool plane[101][101]={false, };
	int coordinate[4][4], area=0;

	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			scanf("%d", &coordinate[i][j]);

	for(int i=0;i<4;i++)
		for(int x=coordinate[i][0];x<coordinate[i][2];x++)
			for(int y=coordinate[i][1];y<coordinate[i][3];y++)
				plane[x][y]=true;

	for(int x=1;x<101;x++)
		for(int y=1;y<101;y++)
			area+=plane[x][y];

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

문제

같은 길이의 성냥개비가 여러 개 주어져 있다. 이것들을 평면에 늘어놓아서 삼각형을 만들려고 한다. 삼각형의 한 변은 여러 개의 성냥개비를 직선으로 이어서 만들 수 있지만, 성냥개비를 꺾거나 잘라서 변의 한 부분을 만들 수는 없다. 성냥개비의 개수가 주어졌을 때, 이들 성냥개비를 사용하여 만들 수 있든 서로 다른 삼각형의 개수를 구하는 프로그램을 작성하시오.

예를 들어서 9개의 성냥개비로 만들 수 있는 서로 다른 삼각형은 그림 1과 같이 3가지이다.

<주의사항>

  1. 주어진 성냥개비는 모두 사용하여 하나의 삼각형을 만들어야 한다.
  2. 삼각형을 한 개도 만들 수 없으면 0을 출력한다. 예를 들어서, 주어진 성냥개비의 수가 1, 2, 또는 4인 경우에는 삼각형을 한 개도 만들 수 없다.
  3. 합동인 삼각형들은 같은 삼각형으로 본다. 예를 들어서 성냥개비 5개를 사용하여 만들수 있는 그림 2의 삼각형들은 같은 삼각형으로 본다.

입력

첫째 줄에 성냥개비의 개수가 주어진다. 성냥개비의 개수는 1 이상 50,000 이하이다.

출력

첫째 줄에 만들 수 있는 삼각형의 개수를 출력한다.

예제 입력 1

9

예제 출력 1

3

더보기

Solution

#include<stdio.h>

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

	scanf("%d", &N);

	for(int i=1;i*3<=N;i++)
		for(int j=i;i+2*j<=N;j++)
			count+=2*(i+j)>N;

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

문제

정보초등학교의 연아는 여러 개의 자연수가 주어졌을 때, 이를 대표할 수 있는 대표 자연수에 대하여 연구하였다. 그 결과 어떤 자연수가 다음과 같은 성질을 가지면 대표 자연수로 적당할 것이라고 판단하였다.

“대표 자연수는 주어진 모든 자연수들에 대하여 그 차이를 계산하여 그 차이들 전체의 합을 최소로 하는 자연수이다.”

예를 들어 주어진 자연수들이 [4, 3, 2, 2, 9, 10]이라 하자. 이때 대표 자연수는 3 혹은 4가 된다. 왜냐하면 (4와 3의 차이) + (3과 3의 차이) + (2와 3의 차이) + (2와 3의 차이) + (9와 3의 차이) + (10과 3의 차이) = 1+0+1+1+6+7 = 16이고, (4와 4의 차이) + (3과 4의 차이) + (2와 4의 차이) + (2와 4의 차이) + (9와 4의 차이) + (10과 4의 차이) = 0+1+2+2+5+6 = 16으로 같으며, 이 두 경우가 차이들의 합을 최소로 하기 때문이다. 비교를 위하여 평균값인 5의 경우를 생각하여 보면, (4와 5의 차이) + (3과 5의 차이) + (2와 5의 차이) + (2와 5의 차이) + (9와 5의 차이) + (10과 5의 차이) = 1+2+3+3+4+5 = 18로 위의 두 경우보다 차이들의 합이 더 커짐을 볼 수 있다.

연아를 도와서 위의 성질을 만족하는 대표 자연수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에는 자연수의 개수 N이 입력된다. N은 1 이상 20,000 이하이다. 둘째 줄에는 N개의 자연수가 빈칸을 사이에 두고 입력되며, 이 수들은 모두 1 이상 10,000 이하이다.

출력

첫째 줄에 대표 자연수를 출력한다. 대표 자연수가 두 개 이상일 경우 그 중 제일 작은 것을 출력한다.

예제 입력 1

6
4 3 2 2 9 10

예제 출력 1

3

더보기

Solution

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

int abs(int X)
{
	return X<0?-X:X;
}

int main(void)
{
	int N, *num=NULL, lastdifference=1000000000;

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

	for(int n=0;n<N;n++)
		scanf("%d", &num[n]);

	for(int i=1;i<10001;i++)
	{
		int difference=0;

		for(int n=0;n<N;n++)
			difference+=abs(i-num[n]);

		if(difference>=lastdifference)
		{
			printf("%d\n", i-1);
			break;
		}
		else
			lastdifference=difference;
	}

	free(num);
	return 0;
}
728x90

문제

평면에 색깔이 서로 다른 직사각형 모양의 색종이 N장이 하나씩 차례로 놓여진다. 이때 색종이가 비스듬하게 놓이는 경우는 없다. 즉, 모든 색종이의 변은 서로 평행하거나, 서로 수직이거나 둘 중 하나이다. 그림-1은 1번, 2번, 3번 세 장의 색종이가 순서대로 놓인 상태를 보여준다.

그림-1

여기에 그림-2에서 보인 것처럼 4번 색종이가 하나 더 놓이면 3번 색종이는 완전히 가려서 보이지 않게 된다. 그리고, 1번 색종이와 2번 색종이는 부분적으로 가려 보이며, 4번 색종이는 완전히 보이게 된다.

그림-2

N장의 색종이가 주어진 위치에 차례로 놓일 경우, 각 색종이가 보이는 부분의 면적을 구하는 프로그램을 작성하시오. 

입력

입력의 첫 번째 줄에는 색종이의 장수를 나타내는 정수 N (1 ≤ N ≤ 100)이 주어진다. 이어서 N장의 색종이에 관한 입력이 각 색종이마다 한 줄씩 차례로 주어진다. 색종이가 놓이는 평면은 가로 최대 101칸, 세로 최대 101칸으로 구성된 격자 모양이다. 격자의 각 칸은 가로, 세로 길이가 1인 면적이 1인 정사각형이다. 

편의상 가로 6칸, 세로 6칸으로 이루어진 격자의 예를 들어 설명하면, 각 칸에 표시된 값 (a,b)는 해당 칸의 번호를 나타낸다. 가장 왼쪽 아래의 칸은 (0,0) 가장 오른 쪽 위의 칸은 (5,5)이다. 

색종이가 놓인 상태는 가장 왼쪽 아래 칸의 번호와 너비, 높이를 나타내는 네 정수로 표현한다. 예를 들어, 위 그림에서 회색으로 표시된 색종이는 (1,4)가 가장 왼쪽 아래에 있고 너비 3, 높이 2이므로 1 4 3 2로 표현한다. 색종이가 격자 경계 밖으로 나가는 경우는 없다. 

출력

입력에서 주어진 순서에 따라 N장의 색종이를 평면에 놓았을 때, 입력에서 주어진 순서대로 각 색종이가 보이는 부분의 면적을 한 줄에 하나씩 하나의 정수로 출력한다. 만약 색종이가 보이지 않는다면 정수 0을 출력한다. 

예제 입력 1

2
0 0 10 10
2 2 6 6

예제 출력 1

64
36

더보기

Solution

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

int main(void)
{
	int N, plane[102][102]={0, }, x, y, width, height, *area=NULL;

	scanf("%d", &N);
	area=(int *)calloc(N+1,sizeof(int));

	for(int n=1;n<=N;n++)
	{
		scanf("%d %d %d %d", &x, &y, &width, &height);

		for(int i=0;i<width;i++)
			for(int j=0;j<height;j++)
				plane[x+i][y+j]=n;
	}

	for(int i=0;i<102;i++)
		for(int j=0;j<102;j++)
			area[plane[i][j]]++;

	for(int n=1;n<=N;n++)
		printf("%d\n", area[n]);
	free(area);
	return 0;
}
728x90

문제

숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 가지고 있는지 아닌지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다.

셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다

출력

첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 가지고 있으면 1을, 아니면 0을 공백으로 구분해 출력한다.

예제 입력 1

5
6 3 2 10 -10
8
10 9 -5 2 3 4 5 -10

예제 출력 1

1 0 0 1 1 0 0 1

더보기

Solution

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

int main(void)
{
	int N, M, number;
	bool *plus=NULL, *minus=NULL;

	plus=(bool *)calloc(10000001,sizeof(bool));
	minus=(bool *)calloc(10000000,sizeof(bool));
	scanf("%d", &N);

	for(int n=0;n<N;n++)
	{
		scanf("%d", &number);

		if(number<0)
			minus[-number-1]=true;
		else
			plus[number]=true;
	}

	scanf("%d", &M);
	for(int m=0;m<M;m++)
	{
		scanf("%d", &number);
		printf("%d ", number<0?minus[-number-1]:plus[number]);
	}

	printf("\n");
	free(minus);
	free(plus);
	return 0;
}
728x90

+ Recent posts