문제

꿍은 우주여행을 하고 싶어져서 우주여행을 계획하기 시작했다. 몇 가지를 고려해본 결과 우주여행에는 우주선의 연료와 목적지까지의 도착시간이 가장 큰 영향을 미치는것으로 파악됐다. 꿍은 엄청난 부자여서 우주선이 여러대가 있는데 각각의 우주선마다 최고속도와 연료소비율이 조금씩 다르다. 연료 소비율은 단위시간당 소비하는 연료의 양이다.

모든 우주선이 최고속도에 즉시 도달한다고 할 때 꿍이 가고싶어하는 곳까지 여행할 수 있는 우주선은 총 몇대인지 여러분이 대신 구해줘라.

입력

입력은 테스트케이스의 개수 T (1 ≤ T ≤ 50)로 시작한다.

각 테스트케이스는 공백으로 구분되는, 우주선의 개수 N (1 ≤ N ≤ 100)과 목적지 까지의 거리 D (1 ≤ D ≤ 106), 두 개의 정수로 시작한다. 다음 N줄에는 각각 공백으로 구분되는, 우주선의 최고속도 vi (1 ≤ vi ≤ 1000)와 우주선의 연료양 fi (1 ≤ fi ≤ 1000)와 우주선의 연료소비율 ci (1 ≤ ci ≤ 1000), 세개의 정수가 주어진다.

출력

각 테스트케이스에 대해 목적지까지 갈 수 있는 우주선의 개수를 구하여라.

이때, 정수의 나눗셈에 조심하라!

예제 입력 1

2
3 100
52 75 10
88 13 44
56 9 5
2 920368
950 950 1
943 976 1

예제 출력 1

2
1

더보기

Solution

#include<stdio.h>

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

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		int count=0, v, f, c;

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

		for(int n=0;n<N;n++)
		{
			scanf("%d %d %d", &v, &f, &c);
			count+=(float)v*f/c>=D;
		}

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

	return 0;
}
728x90

문제

재석이는 대문에 붙이는 (주소를 나타내는) 호수판 제작업체의 직원이다. 고객에게 전달할 호수판은 숫자와 숫자 사이 그리고 왼쪽 오른쪽으로 적당히 여백이 들어가 줘야하고 숫자마다 차지하는 간격이 조금씩 상이하다. 다행이도 규칙은 매우 간단하다. 

  1. 각 숫자 사이에는 1cm의 여백이 들어가야한다.
  2. 1은 2cm의 너비를 차지해야한다. 0은 4cm의 너비를 차지해야한다. 나머지 숫자는 모두 3cm의 너비를 차지한다.
  3. 호수판의 경계와 숫자 사이에는 1cm의 여백이 들어가야한다.

예를 들어 위의 120 같은 경우,  각 숫자 사이에 여백이 1cm 씩 2개 들어간다. 1은 2cm, 2는 3cm, 0은 4cm를 차지한다. 오른쪽, 왼쪽 경계에서 각각 여백이 1cm씩 차지한다. 따라서 총 2 + 2 + 3 + 4 + 1 + 1 = 13(cm) 가 된다.

재석이는 고객에게 전달해야할 호수판의 너비가 얼마나 되는지 궁금해졌다. 재석이를 도와주자!

입력

호수판에 들어갈 숫자 N의 범위는 1 ≤ N ≤ 9999 이다.

입력은 마지막에 0이 들어오기 전까지 계속해서 줄 단위로 주어진다.

또한, 마지막의 0은 처리하지 않는다.

출력

각 입력마다 얼마만큼 너비를 차지하는지 정수로 출력하면 된다.

각 출력은 줄바꿈으로 구분되어야한다.

예제 입력 1

120
5611
100
0

예제 출력 1

13
15
14

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N;

	scanf("%d", &N);
	while(N!=0)
	{
		int temp=N, length=1;

		while(temp>0)
		{
			length+=temp%10==0?5:temp%10==1?3:4;
			temp/=10;
		}
			printf("%d\n", length);
			scanf("%d", &N);
	}

	return 0;
}
728x90

문제

환규는 오늘부터 주식 투자를 하려고 한다. 열심히 정보를 수집한 결과 A사, B사, C사에 투자하기로 했다. 환규는 오늘 산 주식이 내일 오를지, 떨어질지 예측하는 것이 아직은 힘들다. 그래서 다음과 같이 투자를 하기로 했다. 먼저 서로 다른 날에는 서로 다른 회사의 주식을 살 수 있지만, 하루에는 최대 1개 회사의 주식만 사도록 한다. 매일 장이 열리기 전에 A사, B사, C사 중 그날 주식을 살 회사를 하나 정한 후, 장이 열릴 때 정한 회사의 주식을 산다. 그 다음 장이 닫힐 때 그날 산 주식을 모두 판다. 만약 세 회사 중 어느 곳도 수익이 날 것 같지 않으면 주식을 구매하지 않아도 된다.

환규는 주식을 처음 해보기 때문에 과연 주식으로 돈을 벌 수 있을지 궁금해졌다. 그래서 투자하려는 회사들의 지난 N일 동안의 주식 데이터를 이용해 N일 동안 위 규칙을 지키며 주식투자를 했을 때 과연 얼마를 벌 수 있는지 계산해 보기로 했다. 먼저 A사, B사, C사의 N일 동안의 주가 데이터를 모았다. 환규는 이 데이터를 이용해 각 회사별로 장이 열릴 때 주식을 사고, 장이 닫힐 때 모두 팔았을 경우 매일 얼마를 벌 수 있었는지 정리했다. 다음은 N = 4일때 환규가 정리한 데이터를 나타내는 표이다.

날짜
회사명
1일 2일 3일 4일
A사 500 300 -100 600
B사 800 0 -200 200
C사 200 300 -400 300

위 표에서 양수는 이익을, 음수는 손해를 나타내며, 0은 이익도, 손해도 없음을 의미한다. 예를 들어 1일째에 A사의 주식을 장이 열릴 때 사고, 장이 닫힐 때 팔면 500의 이익을 얻을 수 있었다. 만약 3일째에 C사의 주식을 장이 열릴 때 사고, 장이 닫힐 때 판다면 400의 손해가 생겼을 것이다.

데이터를 분석하던 환규는 자신이 정리한 데이터를 이용해서 N일 동안 규칙을 지키면서 매일 최적의 투자를 할 경우 최대 얼마를 벌 수 있었는지 궁금해졌다. 예를 들어 위 표에서 1일째에는 B사의 주식을 사면 가장 많은 이익을 남길 수 있다. 2일째에는 A사, 또는 C사의 주식을 사면 가장 많은 이익을 남길 수 있다. 3일째에는 어떤 주식을 사도 손해가 나므로 주식을 사지 않는다. 4일째에는 A사의 주식을 사면 된다. 이렇게 주식 투자를 할 경우 환규는 800 + 300 + 0 + 600 = 1700으로, 최대 1700의 이익을 남길 수 있다. N일 동안 A사, B사, C사의 주식을 장이 열릴 때 사고, 장이 닫힐 때 모두 팔았을 경우의 손익을 정리한 데이터가 주어질 때, 환규가 N일간 규칙을 지키며 최적의 투자를 했을 경우 얻을 수 있었을 최대 이윤을 출력하는 프로그램을 작성하시오.

입력

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫째 줄에는 테스트 케이스의 개수를 나타내는 자연수 T가 주어진다. 각각의 테스트 케이스의 첫째 줄에 환규가 정리한 주식 데이터의 일수를 나타내는 자연수 N(1 ≤ N ≤ 1,000)이 주어진다. 다음 N개의 줄에 각 회사별 주식을 구매했을 때, 그날 그날의 손익을 나타내는 3개의 정수 A, B, C (-1,000,000 ≤ A, B, C ≤1,000,000)가 주어진다. A는 A사의 주식을 구매했을 때의 손익, B는 B사의 주식을 구매했을 때의 손익, C는 C사의 주식을 구매했을 때의 손익을 나타낸다.

출력

출력은 표준 출력을 사용한다. 입력받은 데이터에 대해, 환규가 N일 동안 규칙을 지키며 최적의 투자를 했을 경우 얻을 수 있었을 최대 이익을 한 줄에 1개씩 출력한다.

예제 입력 1

2
4
500 800 200
300 0 300
-100 -200 -400
600 200 300
3
451 234 309
224 334 467
143 246 245

예제 출력 1

1700
1164

더보기

Solution

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

int main(void)
{
	int T;

	scanf("%d", &T);
	for(int t=0;t<T;t++)
	{
		int N, **pl=malloc(3*sizeof(int *)), sum=0;

		scanf("%d", &N);
		for(int days=0;days<3;days++)
			pl[days]=(int *)malloc(N*sizeof(int));

		for(int days=0;days<N;days++)
		{
			int max=0;

			for(int i=0;i<3;i++)
			{
				scanf("%d", &pl[i][days]);
				max=pl[i][days]>max?pl[i][days]:max;
			}
			sum+=max;
		}

		printf("%d\n", sum);
		for(int days=0;days<3;days++)
			free(pl[days]);
		free(pl);
	}

	return 0;
}
728x90

문제

철수는 쿠키를 세상에서 제일 좋아한다. 쿠키가 있는 곳이라면 철수도 반드시 있다고 할 정도이다. 철수는 날마다 자신이 가지고 있는 쿠키 중 C개를 먹는다. C개 미만의 쿠키가 남아 있다면 전부 먹는다. 철수가 쿠키 N개를 가지고 있으면 며칠 동안 먹을 수 있는지 구하시오.

입력

첫 번째 줄에는 테스트케이스의 개수 T가 주어진다. 그 다음 줄부터 T개의 줄에 테스트케이스가 한 줄씩 주어진다. 테스트케이스는 철수가 가진 쿠키의 개수 N과 날마다 먹는 쿠키의 개수 C로 이루어져 있다.

출력

각 테스트케이스마다 한 줄씩 철수가 며칠 동안 쿠키를 먹을 수 있는지 출력한다.

제한

  • 0 < T < 100
  • 0 < N < 1,000,000,000
  • 0 < C < 5,000

예제 입력 1

2
6 2
10 3

예제 출력 1

3
4

더보기

Solution

#include<stdio.h>

int main(void)
{
	int T, N, C;

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		scanf("%d %d", &N, &C);
		printf("%d\n", N/C+(N%C!=0));
	}

	return 0;
}
728x90

문제

Byteland Airlines recently extended their aircraft fleet with a new model of a plane. The new acquisition has n(1) rows of seats in the business class and n(2) rows in the economic class. In the business class each row contains k(1) seats, while each row in the economic class has k(2) seats.

Write a program which:

  • reads information about available seats in the plane,
  • calculates the sum of all seats available in that plane,
  • writes the result.

입력

In the first and only line of the standard input there are four integers n(1), k(1), n(2) and k(2) (1 ≤ n(1), k(1), n(2), k(2) ≤ 1 000), separated by single spaces.

출력

The first and only line of the standard output should contain one integer - the total number of seats available in the plane.

예제 입력 1

2 5 3 20

예제 출력 1

70

더보기

Solution

#include<stdio.h>

int main(void)
{
	int n1, n2, k1, k2;

	scanf("%d %d %d %d", &n1, &k1, &n2, &k2);

	printf("%d\n", n1*k1+n2*k2);
	return 0;
}
728x90

문제

창영 마을의 우체부, 우유배달원, 신문배달원은 상근이네 집에 가는 것을 매우 싫어한다. 그 이유는 상근이네 집에는 사나운 개 두 마리가 지키고 있기 때문이다. 하지만, 그들은 이 개의 행동이 예측 가능하다는 것을 모르고 있다.

매일 아침, 개 한마리는 A분동안 공격적이고, B분동안 조용히 쉬고 있다. 또다른 개는 C분동안 공격적이고, D분동안 조용히 쉰다. 두 개는 이 행동을 계속해서 연속적으로 반복한다.

우체부, 신문배달원, 우유배달원의 도착 시간이 주어졌을 때, 개 몇 마리에게 공격을 받는지 알아내는 프로그램을 작성하시오.

입력

첫째 줄에 A, B, C, D가 주어진다. 

둘째 줄에는 P, M, N가 주어진다. P는 우체부의 도착 시간, M은 우유배달원의 도착 시간, N은 신문배달원의 도착 시간이다. 매일 아침이 시작하는 시간을 0이라고 한다. 도착 시간은 아침이 시작한 후 지난 시간이다. 예를 들어, P가 3이면, 우체부는 아침이 시작하고 세 번째 분이 진행되는 중에 도착했다는 뜻이다.

모든 수는 1보다 크거나 같고, 999보다 작거나 같은 정수이다.

출력

첫째 줄에는 우체부, 둘째 줄에는 우유배달원, 셋째 줄에는 신문배달원이 개 몇 마리에게 공격 받는지 출력한다.

예제 입력 1

2 2 3 3
1 3 4

예제 출력 1

2
1
0

더보기

Solution

#include<stdio.h>

int main(void)
{
	int A, B, C, D, P, M, N;

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

	printf("%d\n", (P%(A+B)<=A&&P%(A+B)>0)+(P%(C+D)<=C&&P%(C+D)>0));
	printf("%d\n", (M%(A+B)<=A&&M%(A+B)>0)+(M%(C+D)<=C&&M%(C+D)>0));
	printf("%d\n", (N%(A+B)<=A&&N%(A+B)>0)+(N%(C+D)<=C&&N%(C+D)>0));
	return 0;
}
728x90

문제

정수가 주어지면, 그 수의 정수 제곱근을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 n이 주어진다. (0 ≤ n < 2^63)

출력

첫째 줄에 q^2 ≥ n인 가장 작은 음이 아닌 정수 q를 출력한다.

예제 입력 1

122333444455555

예제 출력 1

11060446

더보기

Solution

#include<stdio.h>
#include<math.h>

int main(void)
{
	unsigned long long int n, q;

	scanf("%llu", &n);

	q=(unsigned long long int)sqrt(n);
	if(q*q<n)
		q++;

	printf("%llu\n", q);
	return 0;
}
728x90

문제

정보 초등학교 6학년 여학생들은 단체로 2박 3일 수학여행을 가기로 했다. 학생들이 묵을 숙소에는 방의 정원(방 안에 있는 침대 수)을 기준으로 세 종류의 방이 있으며, 같은 종류의 방들이 여러 개 있다. 정보 초등학교에서는 학생들에게 이 방들을 배정하되, 배정된 모든 방에 빈 침대가 없도록 하고자 한다.

예를 들어, 방의 종류가 5인실, 9인실, 12인실이고 6학년 여학생 전체가 113명 이라면, 5인실 4개, 9인실 5개, 12인실 4개를 예약하면 각 방에 남는 침대 없이 배정이 가능하다. 또한 12인실은 사용하지 않고 5인실 10개와 9인실 7개만 사용하는 것도 가능하다. 그러나 방의 종류가 3인실, 6인실, 9인실이고 6학년 여학생 전체가 112명이라면 빈 침대 없이 방을 배정하는 것은 불가능하다.

방의 정원을 나타내는 서로 다른 세 자연수와 전체 학생 수를 나타내는 자연수 하나가 주어졌을 때, 배정된 모든 방에 빈 침대가 없도록 방 배정이 가능한지를 결정하는 프로그램을 작성하시오. 단, 세 종류의 방은 모두 충분한 개수가 있다고 가정하며, 위의 예에서와 같이 세 종류의 방을 모두 활용하지 않고 한 종류 또는 두 종류의 방만 이용하여 배정하는 것도 허용한다.

입력

표준 입력으로 방의 정원을 나타내는 서로 다른 세 자연수 A, B, C (1 ≤ A < B < C ≤ 50)와 전체 학생 수를 나타내는 자연수 N (1 ≤ N ≤ 300)이 공백으로 분리되어 한 줄에 주어진다.

출력

빈 침대 없이 배정이 가능할 경우 표준 출력으로 1을, 불가능할 경우 0을 출력한다.

예제 입력 1

5 9 12 113

예제 출력 1

1

예제 입력 2

3 6 9 112

예제 출력 2

0

더보기

Solution

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

int main(void)
{
	int A, B, C, N;
	bool solved=false;

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

	for(int c=0;c<=N;c+=C)
	{
		for(int b=0;b+c<=N;b+=B)
			if((N-b-c)%A==0)
			{
				solved=true;
				break;
			}
		if(solved)
			break;
	}

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

+ Recent posts