문제

덧셈, 뺄셈, 곱셈, 나눗셈을 할 수 있는 계산기 프로그램을 만드시오.

입력

입력의 각 줄에는 숫자와 +, -, *, /, =중 하나가 교대로 주어진다. 첫 번째 줄은 수이다. 연산자의 우선 순위는 생각하지 않으며, 입력 순서대로 계산을 하고, =가 주어지면, 그때까지의 결과를 출력한다. 주어지는 수는 10^8 이하의 양의 정수이다. 계산 중 결과는 0 또는 음수가 될 수 있지만, -10^8 ~ 10^8 범위를 넘지는 않는다. 또, 나눗셈에서 소수점은 버린다. 따라서, 100/3*3 = 99이다.

피제수가 음수일 때 나눗셈을 하는 경우는 입력으로 주어지지 않는다.

출력

첫째 줄에 계산 결과를 출력한다.

예제 입력 1

1
+
1
=

예제 출력 1

2

더보기

Solution

#include<stdio.h>

int main(void)
{
	int result=0, number;
	char operator='\0';

	while(operator!='=')
	{
		scanf("%d", &number);

		switch(operator)
		{
			case '-':
						result-=number;
						break;
			case '*':
						result*=number;
						break;
			case '/':
						result/=number;
						break;
			default:
						result+=number;
						break;
		}

		getchar();
		scanf("%c", &operator);
	}

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

문제

자연수 A, B가 주어지면 A+B를 구하는 프로그램을 작성하시오.

입력

자연수 A, B (0 < A, B ≤ 10)가 첫 번째 줄에 주어진다. 단, 두 수의 사이에는 공백이 주어지지 않는다. 두 수의 앞에 불필요한 0이 붙는 경우는 없다.

출력

첫 번째 줄에 A+B의 값을 출력한다.

예제 입력 1

37

예제 출력 1

10

예제 입력 2

102

예제 출력 2

12

더보기

Solution

#include<stdio.h>

int main(void)
{
	int AB;

	scanf("%d", &AB);

	printf("%d\n", AB%10==0?AB/100+10:AB/10+AB%10);
	return 0;
}
728x90

문제

역사상 최고의 천재중 하나인 폰 노이만에게는 다음과 같은 재밌는 일화가 있다.

그의 동료는 어느 날 폰 노이만의 천재성을 시험해보기 위해서 다음과 같은 질문을 던졌다. 

“200마일 길이의 철로의 양쪽 끝에 서 있는 두 대의 기차가 시속 50마일의 속도로 서로를 향해 출발했습니다. 이때부터 두 기차가 서로 충돌할 때까지 파리가 시속 75마일의 속도로 두 기차사이를 왔다 갔다 했습니다. 파리가 이동한 거리는 모두 몇 마일일까요?”

폰 노이만은 문제를 듣고 1초의 지체도 없이 150마일이라고 답했다. 그의 동료는 크게 실망하며 말했다.

“역시 당신은 똑똑하군요. 보통 사람들은 이 문제를 무한급수를 이용해서 풀려고 하지만 그렇게 하면 매우 긴 시간이 걸리죠. 하지만 간단한 논리를 사용하면 순식간에 파리가 이동한 거리를 구할 수 있습니다. 당신도 그 논리를 이용한 것이죠?”

그러자 폰 노이만은 이렇게 답했다.

“아니요, 무한급수로 풀었는데요?”

이 문제를 무한급수를 통해 푸는 방법은 다음과 같다.  수직선 위에 기차 A, B가 있다고 하자.  파리와 같이 출발하는 기차를 A라 하고, 그 위치를 기준점으로 하면 기차 B는 기준점에서 200마일 만큼 떨어진 지점에 있다. 이때 시간 t에서 파리의 위치는 75t 이고 기차 B의 위치는 200 – 50t 이다. 이를 이용하면 파리와 기차 B가 처음 만나는 위치는 기준점에서 120마일 떨어진 지점임을 알 수 있다.  120마일은 파리의 첫 이동거리 이고 이를 a(1)이라고 하자.  한편 이때 기차 A는 80마일 떨어진 지점에 위치한다 (기차 A의 속도는 파리의 속도의 2/3 이므로).  그러므로 기차 A와 B의 사이가 40마일로 줄어들었고, 같은 식으로 파리의 두 번째 이동거리 a(2)는 (1/5)a(1)임을 알 수 있다.  이와 같이 생각하면, a(i+1)은 (1/5)^ia(1)이고, 파리의 총 이동거리는 Σ(1/5)^ia(1) = 150 즉 150마일임을 알 수 있다.

이 문제를 푸는 “간단한 논리”는 다음과 같다.  두 기차는 200/(50*2) = 2 시간 후에 만난다.  파리는 2시간동안 시간당 75마일의 속도로 이동하므로 2*75 = 150 마일을 이동한다.

우리는 위에서 제시한 문제를 풀 수 있는 프로그램을 만들고 싶다. 하지만 우리의 컴퓨터는 안타깝게도 폰 노이만의 두뇌보다 성능이 좋지 못하기 때문에 무한급수를 이용하여 프로그램을 만들 수는 없다.  위에서 말한 “간단한 논리”를 이용하여 기차의 속도 S,  파리의 속도 T, 그리고 처음 두 기차 사이의 거리 D가 주어졌을 때 두 기차가 만날 때까지 파리의 이동거리 F를 계산하는 프로그램을 작성하라.

입력

S T D
  • 각각 10,000보다 작거나 같은 양의 정수, T>S, D는 2*S의 배수

출력

F

예제 입력 1

50 75 200

예제 출력 1

150

더보기

Solution

#include<stdio.h>

int main(void)
{
	int S, T, D;

	scanf("%d %d %d", &S, &T, &D);

	printf("%d\n", T*D/2/S);
	return 0;
}

 

728x90

문제

영희와 동수는 동전 던지기 게임을 하고 있다. 이 게임은 K번 라운드로 구성되고 다음과 같은 규칙들을 따른다:

  1. 한 라운드에서 영희와 동수는 한 번씩 동전을 던지고 항상 영희가 먼저 던진다. 
  2. 동전을 던져 앞면이 나오면 1점을 얻고, 뒷면이 나오면 점수를 얻지 못한다. 
  3. 한 명이 남은 기회에 모든 점수를 얻더라도 상대방이 현재까지 얻은 점수보다 작게 되면 게임 도중 어떤 시점에서도 게임은 바로 끝난다. 

0이상 K이하인 임의의 정수 M과 N에 대해서, 이것이 항상 게임이 끝난 후 영희와 동수가 얻는 점수가 되는 것은 아니다. 예를 들어서, K = 2인 경우에, M과 N의 모든 경우에 대해서, 이것이 영희와 동수가 얻는 점수가 될 수 있는 지의 여부는 다음 표와 같다:

M N 영희, 동수의 점수가 될 가능성
0 0 가능
0 1 가능
0 2 불가능
1 0 가능
1 1 가능
1 2 가능
2 0 가능
2 1 가능
2 2 가능

위 표에서 영희와 동수의 점수가 0과 2가 되는 것이 불가능한 이유는 두 번째 라운드에서 영희가 뒷면이 나와서 점수를 얻지 못하는 순간 게임의 규칙 3에 의해서 0과 1로 게임이 끝나기 때문이다. 

0이상 K이하인 정수 M과 N이 주어질 때, 이 두 정수가 각각 영희와 동수의 점수가 될 수 있는지 여부를 판별하는 프로그램을 작성하시오.

입력

첫 줄에 게임의 라운드 수를 나타내는 정수 K(1 ≤ K ≤ 1,000)가 주어진다. 두 번째 줄에는 입력의 개수를 나타내는 정수 C(1 ≤ C ≤ 100,000)가 주어진다. 다음 이어지는 C개의 줄 각각에는 하나의 입력을 나타내는 두 정수 M과 N(0 ≤ M, N ≤ K)이 주어진다. 

출력

출력은 C개의 줄로 구성된다. 게임에서 영희와 동수의 점수가 각각 M과 N이 될 수 있다면 1, 아니면 0을 각 줄에 출력한다. 

예제 입력 1

5
4
5 5
5 1
0 3
1 4

예제 출력 1

1
0
1
0

더보기

Solution

#include<stdio.h>

int main(void)
{
	int K, C, M, N;

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

	for(int c=0;c<C;c++)
	{
		scanf("%d %d", &M, &N);
		printf("%d\n",M>N?2*M<N+K+3:M<N?2*N<M+K+2:1);
	}

	return 0;
}
728x90

문제

김탑은 TV를 사러 인터넷 쇼핑몰에 들어갔다. 쇼핑을 하던 중에, TV의 크기는 그 TV의 대각선의 길이로 나타낸 다는 것을 알았다. 하지만, 김탑은 대각선의 길이가 같다고 해도, 실제 TV의 크기는 다를 수도 있다는 사실에 직접 TV를 보러갈걸 왜 인터넷 쇼핑을 대각선의 길이만 보고있는지 후회하고 있었다.

인터넷 쇼핑몰 관리자에게 이메일을 보내서 실제 높이와 실제 너비를 보내달라고 했지만, 관리자는 실제 높이와 실제 너비를 보내지 않고 그것의 비율을 보내왔다.

TV의 대각선 길이와, 높이 너비의 비율이 주어졌을 때, 실제 높이와 너비의 길이를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 TV의 대각선 길이, TV의 높이 비율, TV의 너비 비율이 공백 한 칸을 사이에 두고 주어진다. 대각선 길이는 5보다 크거나 같고, 1,000보다 작거나 같은 자연수, 높이 비율은 1보다 크거나 같고, 99보다 작거나 같은 자연수 너비 비율은 2보다 크거나 같고, 100보다 작거나 같은 자연수이다. 너비 비율은 항상 높이 비율보다 크다.

출력

첫째 줄에 TV의 높이와 TV의 너비를 공백 한 칸을 이용해서 구분지은 후 출력한다. 만약, 실제 TV의 높이나 너비가 소수점이 나올 경우에는 그 수보다 작으면서 가장 큰 정수로 출력한다. (예) 1.7 -> 1

예제 입력 1

52 9 16

예제 출력 1

25 45

더보기

Solution

#include<stdio.h>

int main(void)
{
	int diagonal, hor, ver;
	float hor_temp, ver_temp, rate;

	scanf("%d %d %d", &diagonal, &hor, &ver);

	diagonal*=diagonal;
	hor_temp=(float)hor*hor;
	ver_temp=(float)ver*ver;
	rate=diagonal/(hor_temp+ver_temp);
	hor_temp*=rate;
	ver_temp*=rate;

	for(hor=0;hor*hor<=hor_temp;hor++);
	for(ver=0;ver*ver<=ver_temp;ver++);
	hor--;
	ver--;

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

문제

Day Of Mourning의 기타리스트 강토가 사용하는 기타에서 N개의 줄이 끊어졌다. 따라서 새로운 줄을 사거나 교체해야 한다. 강토는 되도록이면 돈을 적게 쓰려고 한다. 6줄 패키지를 살 수도 있고, 1개 또는 그 이상의 줄을 낱개로 살 수도 있다.

끊어진 기타줄의 개수 N과 기타줄 브랜드 M개가 주어지고, 각각의 브랜드에서 파는 기타줄 6개가 들어있는 패키지의 가격, 낱개로 살 때의 가격이 주어질 때, 적어도 N개를 사기 위해 필요한 돈의 수를 최소로 하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 M이 주어진다. N은 100보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 각 브랜드의 패키지 가격과 낱개의 가격이 공백으로 구분하여 주어진다. 가격은 0보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

출력

첫째 줄에 기타줄을 적어도 N개 사기 위해 필요한 돈의 최솟값을 출력한다.

예제 입력 1

4 2
12 3
15 4

예제 출력 1

12

예제 입력 2

10 3
20 8
40 7
60 4

예제 출력 2

36

예제 입력 3

15 1
100 40

예제 출력 3

300

힌트


더보기

Solution

#include<stdio.h>

int main(void)
{
	int N, M, six, one, min6=60000, min1=10000;

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

	for(int m=0;m<M;m++)
	{
		scanf("%d %d", &six, &one);

		min1=min1<one?min1:one;
		min6=6*one<min6?6*one:min6;
		min6=six<min6?six:min6;
	}

	printf("%d\n", min6*(N/6)+(min1*(N%6)<min6?min1*(N%6):min6));
	return 0;
}
728x90

문제

파티가 끝나고 나면, 사람들은 누가 파티에 왔는지와 얼마나 많은 사람들이 왔는지를 궁금해한다. 보통 파티는 매우 크게 열리기 때문에, 정확하게 몇 명이 참가했는지 알 수가 없다.

지난주 토요일에 상근이는 자신의 3학년 진학을 기념하면서 매우 성대한 파티를 열었다. 그리고, 상근이는 1m2당 몇 명의 사람이 있었는지 알고있다.

상근이의 파티는 정말 엄청난 규모였기 때문에, 대부분의 신문에도 기사가 실렸다. 상근이는 서로 다른 5개의 신문을 보면서 그 기사에 적혀져있는 참가자의 수를 적었다.

상근이는 자신이 알고있는 참가자의 수가 정확하다고 생각한다. 각 신문 기사에 실려있는 참가자의 수가 몇 명 만큼 잘못되어있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 1m2당 사람의 수 L (1 ≤ L ≤ 10)과 파티가 열렸던 곳의 넓이 P (1 ≤ P ≤ 1000)가 주어진다.

둘째 줄에는 각 기사에 실려있는 참가자의 수가 주어진다. 106보다 작은 양의 정수 5개가 주어진다.

출력

출력은 첫째 줄에 다섯 개의 숫자를 출력해야 한다. 이 숫자는 상근이가 계산한 참가자의 수와  각 기사에 적혀있는 참가자의 수의 차이이다.

예제 입력 1

5 20
99 101 1000 0 97

예제 출력 1

-1 1 900 -100 -3

더보기

Solution

#include<stdio.h>

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

	scanf("%d %d", &L, &P);

	for(int i=0;i<5;i++)
	{
		scanf("%d", &article);
		printf("%d ", article-L*P);
	}

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

문제

사파리월드는 인터넷으로만 존재하는 미스테리한 나라이다. 사파리월드에는 2개의 서브도메인이 seunghwan.royal.gov.sw와 kyuhyun.royal.gov.sw 이 있는데, 이것이 couple.royal.gov.sw으로 합쳐질 것이다. 그러나 도메인 관리 센터 SWNIC(센터장: 김동규)에는 엄격한 룰이 있다. 두 서브도메인을 합칠 때, 유명도의 차이가 너무 차이나지 않을 경우에만 두 서브도메인을 결혼시키는 것이다. 서브도메인의 유명도는 정수이다. 두 서브도메인의 유명도가 주어졌을 때, 그 차이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 두 도메인의 유명도 N과 M이 주어진다. (-2,000,000,000 ≤ N, M ≤ 2,000,000,000)

출력

첫째 줄에 두 유명도의 차이 (|N-M|)을 출력한다.

예제 입력 1

-2 5

예제 출력 1

7

더보기

Solution

#include<stdio.h>

int main(void)
{
	long int N, M;

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

	N-=M;
	if(N<0)
		N=-N;

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

+ Recent posts