문제

상근이는 3003번에서 동혁이가 발견한 체스판을 톱으로 자르려고 한다.

상근이는 체스판을 최대 N번 자를 수 있으며, 변에 평행하게만 자를 수 있다. 또, 자를 때는 체스판의 그 변의 한쪽 끝에서 다른쪽 끝까지 잘라야 한다. 자른 후에는 조각을 이동할 수 없다.

이때, 최대 몇 조각을 낼 수 있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)

출력

첫째 줄에 상근이가 얻을 수 있는 조각의 최댓값을 출력한다.

예제 입력 1

3

예제 출력 1

6

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N;

	scanf("%d", &N);

	printf("%d\n", (N/2+1)*(N-N/2+1));
	return 0;
}
728x90

문제

삼각형의 세 변의 길이가 주어질 때 변의 길이에 따라 다음과 같이 정의한다.

  • Equilateral :  세 변의 길이가 모두 같은 경우
  • Isosceles : 두 변의 길이만 같은 경우
  • Scalene : 세 변의 길이가 모두 다른 경우

단 주어진 세 변의 길이가 삼각형의 조건을 만족하지 못하는 경우에는 "Invalid" 를 출력한다. 예를 들어 6, 3, 2가 이 경우에 해당한다. 가장 긴 변의 길이보다 나머지 두 변의 길이의 합이 길지 않으면 삼각형의 조건을 만족하지 못한다.

세 변의 길이가 주어질 때 위 정의에 따른 결과를 출력하시오.

입력

각 줄에는 1,000을 넘지 않는 양의 정수 3개가 입력된다. 마지막 줄은 0 0 0이며 이 줄은 계산하지 않는다.

출력

각 입력에 맞는 결과 (Equilateral, Isosceles, Scalene, Invalid) 를 출력하시오.

예제 입력 1

7 7 7
6 5 4
3 2 5
6 2 6
0 0 0

예제 출력 1

Equilateral
Scalene
Invalid
Isosceles

더보기

Solution

#include<stdio.h>

int main(void)
{
	int side[3];

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

	while(side[0]!=0 || side[1]!=0 || side[2]!=0)
	{
		for(int i=0;i<2;i++)
			for(int j=i+1;j<3;j++)
				if(side[i]>side[j])
				{
					int temp=side[i];
					side[i]=side[j];
					side[j]=temp;
				}

		if(side[0]==side[1] && side[1]==side[2])
			printf("Equilateral\n");
		else if(side[0]+side[1]<=side[2])
			printf("Invalid\n");
		else if(side[0]==side[1] || side[1]==side[2])
			printf("Isosceles\n");
		else
			printf("Scalene\n");

		for(int i=0;i<3;i++)
			scanf("%d", &side[i]);
	}

	return 0;
}
728x90

문제

슬프게도, 2017 선린 봄맞이 교내대회의 상품 비용은 욱제의 통장에서 충당된다. 욱제의 마음을 아는지 모르는지, 참가자들이 1등 상품으로 치킨을 무려 두 마리(...)나 달라고 조르고 있다.

욱제에게는 두 개의 통장이 있다. 두 통장의 잔고와 치킨 한 마리의 가격이 주어질 때, 욱제가 치킨 두 마리(...)를 살 수 있는지 알아보자.

입력

첫째 줄에 두 통장의 잔고 A와 B가 주어진다. (0 <= A, B <= 1,000,000,000)

둘째 줄에 치킨 한 마리의 가격 C가 주어진다. (0 <= C <= 1,000,000,001)

출력

욱제가 치킨 두 마리(...)를 살 수 있으면 치킨 두 마리(...)를 사고 남은 두 통장 잔고의 합을, 살 수 없으면 현재 두 통장의 잔고의 합을 출력한다.

예제 입력 1

87 31
20000

예제 출력 1

118

예제 입력 2

15000 6000
5000

예제 출력 2

11000

예제 입력 3

1000000000 1000000000
1000000001

예제 출력 3

2000000000

더보기

Solution

#include<stdio.h>

int main(void)
{
	int A, B, C;

	scanf("%d %d %d", &A, &B, &C);

	printf("%d\n", A+B>=2*C?A+B-2*C:A+B);
	return 0;
}
728x90

문제

등차수열(AP)은 인접한 두 수의 차이(공차)가 일정한 수열이다. 예를 들어, 3, 5, 7, 9, 11, 13, ...은 차이가 2로 일정한 등차수열이다. 이 문제에서 등차수열의 공차는 항상 0이 아닌 정수이다.

등비수열(GP)는 각 항이 그 앞과 일정한 비(공비)를 가지는 수열이다. 예를 들어, 2, 6, 18, 54, ...은 공비가 3인 등비수열이다. 이 문제에서 등비수열의 공비는 항상 0이 아닌 정수이다.

어떤 수열의 연속한 세개의 숫자가 주어졌을 때, 이 수열이 등차수열인지 등비수열인지를 알아낸 뒤, 다음 항을 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 수열의 연속하는 세 정수 a1, a2, a3이 한 줄에 주어진다. (-10,000 < a1, a2, a3 < 10,000) a1, a2, a3은 서로 같지 않다.

입력의 마지막 줄에는 0이 세 개 주어진다.

출력

각 테스트 케이스에 대해서, 등차수열이면 AP를, 등비수열이면 GP를 출력한 뒤, 다음 항을 출력한다. 모든 입력은 항상 등차수열이나 등비수열이다.

예제 입력 1

4 7 10
2 6 18
0 0 0

예제 출력 1

AP 13
GP 54

더보기

Solution

#include<stdio.h>

int main(void)
{
	int a1, a2, a3;

	scanf("%d %d %d", &a1, &a2, &a3);
	while(a1!=0||a2!=0||a3!=0)
	{
		if(a2-a1==a3-a2)
			printf("AP %d\n", 2*a3-a2);
		else
			printf("GP %d\n", a3*a3/a2);

		scanf("%d %d %d", &a1, &a2, &a3);
	}

	return 0;
}
728x90

문제

수학을 못해도 너무 못하는 상근이는 정인이에게 과외를 받고 있다. 오늘은 상근이가 사칙연산을 배우는 날이다.

정인이는 공책에 숫자 세개로 이루어진 등식을 적어주었다. (식은 자연수와 등호(=), 그리고 더하기, 빼기, 곱하기, 나누기 기호(+-*/)로 이루어져 있다)

상근이는 이런 등식을 사칙연산을 모르는 창영이게 자랑하다가 그만... 창영이는 숫자를 제외한 기호를 모두 지워버리고 말았다.

세 정수가 주어졌을 때, 원래 정인이가 적어준 등식을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정인이가 적어준 세 정수가 주어진다. 이 수는 100보다 작거나 같은 자연수이다. 항상 정답이 존재하는 경우만 입력으로 주어진다.

출력

첫째 줄에 정인이가 원래 적어준 등식을 출력한다. 입력으로 주어진 숫자의 순서는 유지해야 하고, 등호 하나와 더하기, 빼기, 곱하기, 나누기 기호 중 하나로 이루어져 있어야 한다. 만약 등식이 여러 가지가 나올 수 있다면, 그 중 하나만 출력한다.

예제 입력 1

5 3 8

예제 출력 1

5+3=8

더보기

Solution

#include<stdio.h>

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

	scanf("%d %d %d", &a, &b, &c);

	if(a+b==c)
		printf("%d+%d=%d\n", a, b, c);
	else if(a-b==c)
		printf("%d-%d=%d\n", a, b, c);
	else if(a*b==c)
		printf("%d*%d=%d\n", a, b, c);
	else if(a/b==c && a%b==0)
		printf("%d/%d=%d\n", a, b, c);
	else if(a==b+c)
		printf("%d=%d+%d\n", a, b, c);
	else if(a==b-c)
		printf("%d=%d-%d\n", a, b, c);
	else if(a==b*c)
		printf("%d=%d*%d\n", a, b, c);
	else
		printf("%d=%d/%d\n", a, b, c);

	return 0;
}
728x90

문제

상근이와 친구들은 MT에 가서 아래 설명과 같이 재미있는 게임을 할 것이다.

각 플레이어는 1이상 100 이하의 정수를 카드에 적어 제출한다. 각 플레이어는 자신과 같은 수를 쓴 사람이 없다면, 자신이 쓴 수와 같은 점수를 얻는다. 만약, 같은 수를 쓴 다른 사람이 있는 경우에는 점수를 얻을 수 없다.

상근이와 친구들은 이 게임을 3번 했다. 각 플레이어가 각각 쓴 수가 주어졌을 때, 3번 게임에서 얻은 총 점수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 참가자의 수 N이 주어진다. (2 ≤ N ≤ 200) 둘째 줄부터 N개 줄에는 각 플레이어가 1번째, 2번째, 3번째 게임에서 쓴 수가 공백으로 구분되어 주어진다.

출력

각 플레이어가 3번의 게임에서 얻은 총 점수를 입력으로 주어진 순서대로 출력한다.

예제 입력 1

5
100 99 98
100 97 92
63 89 63
99 99 99
89 97 98

예제 출력 1

0
92
215
198
89

힌트

플레이어 1 : 0 + 0 + 0 = 0

플레이어 2 : 0 + 0 + 92 = 92

플레이어 3 : 63 + 89 + 63 = 215

플레이어 4 : 99 + 0 + 99 = 198

플레이어 5 : 89 + 0 + 0 = 89


더보기

Solution

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

int main(void)
{
	int **score=NULL, N, *total=NULL;;

	scanf("%d", &N);
	total=(int *)calloc(N,sizeof(int));
	score=(int **)malloc(N*sizeof(int *));
	for(int i=0;i<N;i++)
		score[i]=(int *)malloc(3*sizeof(int));

	for(int i=0;i<N;i++)
		for(int j=0;j<3;j++)
			scanf("%d", &score[i][j]);

	for(int i=0;i<3;i++)
		for(int j=0;j<N;j++)
		{
			bool same=false;

			for(int k=0;k<N;k++)
				if(j==k)
					continue;
				else if(score[j][i]==score[k][i])
				{
					same=true;
					break;
				}

			if(!same)
				total[j]+=score[j][i];
		}

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

문제

상근이는 덧셈과 나눗셈을 엄청나게 못한다. 이런 상근이를 위해 정인이는 상근이에게 다음과 같은 문제를 냈다.

정인이는 양의 정수 A,B,C,D로 이루어진 2*2 표를 그렸다.

A B
C D

위와 같은 표가 있을 때, 표의 값은 A/C + B/D 이다.

상근이는 표를 몇 번 돌리면 표의 값이 최대가 되는지 궁금해졌다.

표는 90도 시계방향으로 돌릴 수 있다.

문제 상단의 표를 1번 회전 시키면 다음과 같다.

C A
D B

2번 회전 시키면 다음과 같이 된다.

D C
B A

표에 쓰여 있는 A,B,C,D가 주어졌을 때, 표를 몇 번 회전시켜야 표의 값이 최대가 되는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 A와 B가 공백으로 구분되어 주어진다. 둘째 줄에 C와 D가 공백으로 구분되어 주어진다. 모든 수는 100보다 작거나 같은 양의 정수이다.

출력

첫째 줄에 표를 몇 번 돌려야 표의 값이 최대가 되는지 출력한다. 만약, 그러한 값이 여러개라면 가장 작은 값을 출력한다.

예제 입력 1

1 2
3 4

예제 출력 1

2

더보기

Solution

#include<stdio.h>

int main(void)
{
	int A, B, C, D, max=0;
	float value[4];

	scanf("%d %d", &A, &B);
	scanf("%d %d", &C, &D);

	value[0]=(float)A/C+(float)B/D;
	value[1]=(float)C/D+(float)A/B;
	value[2]=(float)D/B+(float)C/A;
	value[3]=(float)B/A+(float)D/C;

	for(int i=1;i<4;i++)
		max=value[i]>value[max]?i:max;

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

문제

소수란 1과 자기 자신으로만 나누어떨어지는 수를 말한다. 예를 들면 1, 2, 3, 5, 17, 101, 10007 등이 소수이다. 이 문제에서는 편의상 1도 소수로 하자.

알파벳 대소문자로 이루어진 영어 단어가 하나 있을 때, a를 1로, b를 2로, …, z를 26으로, A를 27로, …, Z를 52로 하여 그 합을 구한다. 예를 들어 cyworld는 합을 구하면 100이 되고, abcd는 10이 된다.

이와 같이 구한 수가 소수인 경우, 그 단어를 소수 단어라고 한다. 단어가 주어졌을 때, 그 단어가 소수 단어인지 판별하는 프로그램을 작성하시오.

입력

첫째 줄에 단어가 주어진다. 단어의 길이는 20자 이하이다. 주어지는 단어는 알파벳 소문자와 대문자만으로 이루어져 있다.

출력

아래의 예제와 같은 형식으로 출력을 한다. 소수 단어인 경우에는 It is a prime word.를, 아닌 경우에는 It is not a prime word.를 출력한다.

예제 입력 1

UFRN

예제 출력 1

It is a prime word.

더보기

Solution

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

bool isPrime(int N)
{
	if(N==1 || N==2)
		return true;
	else if(N%2==0 || N<1)
		return false;
	else
		for(int i=3;i*i<=N;i++)
			if(N%i==0)
				return false;

	return true;
}

int main(void)
{
	int sum=0;
	char word[21]={'\0', };

	scanf("%s", word);

	for(int i=0;i<strlen(word);i++)
		sum+=islower(word[i])?word[i]-'a'+1:word[i]-'A'+27;

	printf("%s\n", isPrime(sum)?"It is a prime word.":"It is not a prime word.");
	return 0;
}
728x90

+ Recent posts