문제

대전 ACM-ICPC Regional가 끝나면, 대회 참가자들은 다같이 카이스트 근처의 동혁 피자에 간다. 대회는 5시간동안 진행되므로, 참가자는 모두 배가 매우 고프다. 피자를 최대한 빨리 먹기 위해서, 큰 피자를 하나 시키려고 한다. 생각해보니 피자가 너무 크면 식탁 위에 맞지 않을 수도 있다. 식탁은 원이고, 피자는 직사각형이다. 식탁의 반지름과 피자의 크기가 주어졌을 때, 피자가 식탁에 맞는 크기인지 아닌지를 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 숫자 세 개로 이루어져 있고, 순서대로 r, w, l이다. r은 식탁의 반지름이고, w와 l은 피자의 너비와 높이이다. (1 ≤ r ≤ 1000, 1 ≤ w ≤ l ≤ 1000) r이 0이 들어오는 경우에는 프로그램을 종료한다.

출력

각 테스트 케이스에 대해서, 피자가 식탁 위에 놓여질 수 있는지 아닌지를 출력한다. 피자가 식탁의 경계와 접하는 경우는 식탁에 놓여질 수 있다.

예제 입력 1

38 40 60
35 20 70
50 60 80
0

예제 출력 1

Pizza 1 fits on the table.
Pizza 2 does not fit on the table.
Pizza 3 fits on the table.

더보기

Solution

#include<stdio.h>

int main(void)
{
	int r, w, l;

	scanf("%d", &r);

	for(int i=1;r!=0;i++)
	{
		scanf("%d %d", &w, &l);

		if(4*r*r>=w*w+l*l)
			printf("Pizza %d fits on the table.\n", i);
		else
			printf("Pizza %d does not fit on the table.\n", i);

		scanf("%d", &r);
	}

	return 0;
}
728x90

문제

리처드 필립스 파인만은 노벨 물리학상을 수상한 미국의 물리학자이다. 그는 이론물리학을 연구했고, 양자 컴퓨팅 분야를 개척했다. "Surely You’re Joking, Mr. Feynman!", "What Do You Care What Other People Think?"와 같은 그의 책은 많은 사람들의 사랑을 받았고, 한국에도 번역되어 출판되어져 있다. 그는 오랜 기간동안 퍼즐, 자물쇠, 암호를 만들고 푸는 일에 중독되어 있었다. 

어느 날, 남아메리카의 한 농장에서 파인먼의 것으로 추정되는 한 메모가 발견되었다. 퍼즐은 이 메모에는 중간자와 전자기에 대한 내용이 적혀있었고, 가장 마지막 줄에는 다음과 같은 퀴즈가 적혀져 있었다. "N × N 정사각형으로 이루어진 그리드에는 서로 다른 정사각형이 몇 개나 있을까요?" 이 퀴즈의 정답을 구하는 프로그램을 작성하시오.

N = 2인 경우에 정답은 5이다.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 그리드 한 변에 있는 정사각형의 개수 N이 주어진다. (1 ≤ N ≤ 100)

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

출력

각 테스트 케이스에 대해서, 한 줄에 하나씩 서로 다른 정사각형의 개수를 출력한다.

예제 입력 1

2
1
8
0

예제 출력 1

5
1
204

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N;

	scanf("%d", &N);

	while(N!=0)
	{
		printf("%d\n", N*(N+1)*(2*N+1)/6);
		scanf("%d", &N);
	}

	return 0;
}
728x90

문제

유진수는 어떤 수를 10진수로 표현한 뒤 그 수를 두 부분으로 나눴을 때, 앞부분 자리수의 곱과 뒷부분 자리수의 곱이 같을 때를 말한다.

예를 들어, 1221은 유진수이다. 12와 21로 나눴을 때, 앞부분 자리수의 곱 1*2는 뒷부분 자리수의 곱 2*1과 같기 때문이다. 1236도 마찬가지로 유진수이다. 하지만, 1234는 아니다. 수를 나눌 때 항상 연속된 자리수를 나눠야하고, 각 부분에 적어도 한자리는 있어야 한다.

예를 들어, 12345는 총 4가지 방법으로 나눌 수 있다. 1-2345, 12-345, 123-45, 1234-5 어떤 수 N이 주어질 때, 이 수가 유진수인지 아닌지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 수 N이 주어진다. 이 수는 2,147,483,647보다작거나 같은 자연수이다.

출력

첫째 줄에 N이 유진수이면 YES, 아니면 NO를 출력한다.

예제 입력 1

1236

예제 출력 1

YES

더보기

Solution

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

int main(void)
{
	int N;
	char num[11]={'\0', };
	bool found=false;

	scanf("%d", &N);
	sprintf(num,"%d", N);

	for(int i=1;i<strlen(num);i++)
	{
		int num1=1, num2=1;

		for(int j=0;j<i;j++)
			num1*=num[j]-'0';
		for(int j=i;j<strlen(num);j++)
			num2*=num[j]-'0';

		if(num1==num2)
		{
			found=true;
			break;
		}
	}

	printf("%s\n", found?"YES":"NO");
	return 0;
}
728x90

문제

2015, 2016, 2017년에 이어 올해도 연세대학교 컴퓨터과학과 프로그래밍 경진대회가 열린다.

도현이는 4년 연속 교내대회가 개최된다는 것에 감격하여, 사비를 털 각오로 화려한 개막식을 준비했다.

도현이가 원하는 것은 폭죽으로, 강의실 A528에서 천장을 다 뚫어버리며 터지는 화려한 폭죽을 모두가 좋아할 것이라 생각했다. 도현이는 아래와 같이 터지는 폭죽을 주문하려 한다.

  1. 처음 발사된 폭죽이 만든 하나의 대형 불꽃은 적당한 높이에 도달하면 화려한 폭발과 함께 K개의 중형 불꽃으로 갈라진다.
  2. 각 K개의 중형 불꽃은 다시 각각 K개의 소형 불꽃으로 갈라지며 터진다.
  3. 그 이후 모든 불꽃은 소멸한다.

도현이는 적당한 폭죽을 찾아보려 했지만, 폭죽 판매처에서는 K의 값을 알려주지 않았고,

대신 폭죽 하나당 만들어지는 총 불꽃의 수(처음 터진 대형 불꽃을 포함해, 중형 불꽃과 소형 불꽃을 모두 포함한 수)만을 알려줬다. 결국 도현이는 어떤 폭죽이 적당할지 알아내지 못해 폭죽을 구매하지 못했다.

이에 도현이는 이 난제를 해결해주는 학생에게 이번 대회에서 맞은 문제 수를 하나 늘려주기로 하였다. 여러분은 대회에서 우승하기 위해, 폭죽이 만들 모든 불꽃의 개수가 주어지면 K의 값을 찾아보도록 하자.

입력

총 불꽃의 수 N이 주어진다. (3 ≤ N ≤ 10101)

출력

K의 값을 출력한다. 이 값은 정수임이 보장되며, 불가능한 경우는 입력으로 주어지지 않는다.

예제 입력 1

21

예제 출력 1

4

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N, K;

	scanf("%d", &N);

	for(K=0;1+K+K*K<N;K++);

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

문제

N개의 정수 중 서로 다른 위치의 두 수를 뽑는 모든 경우의 두 수의 곱의 합을 구하라.

예를 들어 N = 3이고 주어진 정수가 2, 3, 4일 때, 두 수를 뽑는 모든 경우는 (2, 3), (2, 4), (3, 4)이며 이때 각각의 곱은 6, 8, 12이다. 따라서 총합은 26이다.

입력

첫 번째 줄에는 입력 받을 정수의 개수 N(2 ≤ N ≤ 100,000)

두 번째 줄에는 N 개의 정수가 주어진다. 이때 입력 받는 정수들의 범위는 0이상 10,000 이하이다.

출력

모든 경우의 곱의 합을 출력한다.

예제 입력 1

3
2 3 4

예제 출력 1

26

예제 입력 2

4
1 2 3 4

예제 출력 2

35

예제 입력 3

4
2 3 2 4

예제 출력 3

44

더보기

Solution

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

int main(void)
{
	int N, *arr=NULL;
	long long int mul=0, *sum=NULL;

	scanf("%d", &N);
	arr=(int *)malloc(N*sizeof(int));
	sum=(long long int *)calloc(N,sizeof(long long int));

	for(int i=0;i<N;i++)
	{
		scanf("%d", &arr[i]);

		mul+=i>0?arr[i]*sum[i-1]:0;
		sum[i]=i>0?sum[i-1]+arr[i]:arr[i];
	}

	printf("%lld\n", mul);
	free(arr);
	free(sum);
	return 0;
}
728x90

문제

당신은 어떤 물건이라도 20% 할인해주는 쿠폰을 가지고 있다.

원래 가격이 주어질 때, 쿠폰을 사용하면 얼마가 되는지 알려주는 프로그램을 작성하시오.

입력

첫 번째 줄에 테스트케이스의 수가 주어진다.

각 줄에는 물건의 원래가격이 소수점 둘째자리까지 주어진다.

출력

할인된 가격을 달러 단위로 출력한다.

나누어떨어지지 않을 때는 소수점 셋째 자리에서 반올림해서 둘째 자리까지 출력한다.

예제 입력 1

3
100.00
59.99
20.00

예제 출력 1

$80.00
$47.99
$16.00

더보기

Solution

#include<stdio.h>

int main(void)
{
	int T;
	double price;

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		scanf("%lf", &price);

		price*=0.8;
		price*=1000;
		if((int)price%10>4)
			price+=10;
		price/=1000;

		printf("$%.2lf\n", price);
	}

	return 0;
}
728x90

문제

냉장고에서 맛있게 숙성되고 있는 마카롱은 심심한 나머지 새로운 수 체계를 생각해냈다. 마카롱은 이를 케이크 수라고 이름 붙이고, 다음과 같이 정의했다.

  • 케이크 수는 3개의 자연수 x, y, z로 이루어진 순서쌍이다. (자연수는 1 이상의 정수를 의미한다)
  • 케이크 수 a는 (a.x, a.y, a.z)와 같이 나타낼 수 있다.

또한 마카롱은 케이크 수들을 비교하기 위해 등호 "="도 새로 정의했다.

  • 케이크 수 a, b에 대하여, a = b라는 것은 다음과 같다.
  • a.x = b.x, a.y = b.y 그리고 a.z = b.z를 동시에 만족한다.

아직 끝나지 않았다. 이 케이크 수는 기존의 수와 다르게 매우 특이한 연산을 적용할 수 있다. 연산의 이름은 🍰이고 다음과 같이 정의된다!

a 🍰 b = (a.z + b.x, a.y × b.y, a.x + b.z)

SCCC의 회장 욱제는 케이크 수를 이용해 문제를 만들기로 했다. 마카롱과 욱제를 기쁘게 하기 위해서 문제를 풀어주자! 욱제가 만든 문제는 다음과 같다.

케이크 수 a, c 가 주어졌을 때, 다음을 만족하는 케이크 수 b를 계산하자.

a 🍰 b = c

a, c는 b가 항상 유일하게 존재하도록 주어진다.

입력

첫째 줄에 케이크 수 a를 구성하는 자연수 a.x, a.y, a.z 가 차례대로 주어진다. (1 ≤ a.x, a.y, a.z ≤ 100)

둘째 줄에 케이크 수 c를 구성하는 자연수 c.x, c.y, c.z 가 차례대로 주어진다. (1 ≤ c.x, c.y, c.z ≤ 100)

출력

문제의 조건을 만족하는 b.x, b.y, b.z를 하나의 공백을 사이에 두고 차례대로 출력한다.

b는 1 ≤ b.x, b.y, b.z ≤ 100 이고 반드시 유일하게 존재한다.

예제 입력 1

15 16 17
19 32 90

예제 출력 1

2 2 75

예제 입력 2

15 8 15
22 8 22

예제 출력 2

7 1 7

더보기

Solution

#include<stdio.h>

int main(void)
{
	int a[3], c[3];

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

	printf("%d %d %d\n", c[0]-a[2], c[1]/a[1], c[2]-a[0]);
	return 0;
}
728x90

문제

n개의 원소 중에서 k개를 순서 없이 선택하는 방법의 수는 몇 가지 일까?

입력

입력은 하나 또는 그 이상의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 2^31-1 을 넘지 않는 두 자연수 n(n ≥ 1)과 k(0 ≤ k ≤n)로 이루어져 있다.

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

출력

각 테스트 케이스에 대해서, 정답을 출력한다. 항상 정답이 231보다 작은 경우만 입력으로 주어진다.

예제 입력 1

4 2
10 5
49 6
0 0

예제 출력 1

6
252
13983816

더보기

Solution

#include<stdio.h>

int main(void)
{
	int n, k;

	scanf("%d %d", &n, &k);

	while(n!=0 || k!=0)
	{
		long double c=1.0;

		k=k>n-k?n-k:k;
		for(int i=0;i<k;i++)
			c*=(long double)(n-i)/(i+1);

		printf("%.0Lf\n", c);
		scanf("%d %d", &n, &k);
	}

	return 0;
}
728x90

+ Recent posts