문제

두 양의 정수가 주어졌을 때, 첫 번째 수가 두 번째 수보다 큰지 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 두 정수가 주어진다. 두 수는 백만보다 작거나 같은 양의 정수이다. 입력의 마지막 줄에는 0이 두 개 주어진다.

출력

각 테스트 케이스마다, 첫 번째 수가 두 번째 수보다 크면 Yes를, 아니면 No를 한 줄에 하나씩 출력한다.

예제 입력 1

1 19
4 4
23 14
0 0

예제 출력 1

No
No
Yes

더보기

Solution

#include<stdio.h>

int main(void)
{
	int x, y;

	scanf("%d %d", &x, &y);

	while(x!=0 || y!=0)
	{
		printf("%s\n", x>y?"Yes":"No");

		scanf("%d %d", &x, &y);
	}

	return 0;
}
728x90

문제

10보다 작거나 같은 자연수 N개를 주면 합을 구하는 프로그램을 작성하시오.

입력

입력의 첫 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 10)가 주어진다. 각 테스트 케이스는 첫 줄에 자연수의 개수 N(1 ≤ N ≤ 100)이 주어지고, 그 다음 줄에는 N개의 자연수가 주어진다. 각각의 자연수 사이에는 하나씩의 공백이 있다.

출력

각 테스트 케이스에 대해서 주어진 자연수의 합을 한 줄에 하나씩 출력한다.

예제 입력 1

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

예제 출력 1

5
28

더보기

Solution

#include<stdio.h>

int main(void)
{
	int T;

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		int N, temp, sum=0;

		scanf("%d", &N);

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

			sum+=temp;
		}

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

	return 0;
}
728x90

문제

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)

B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.

출력

첫째 줄에 B진법 수 N을 10진법으로 출력한다.

예제 입력 1

ZZZZZ 36

예제 출력 1

60466175

더보기

Solution

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

int main(void)
{
	char N[50]={'\0', };
	int B, decimal=0, power=1;

	scanf("%s %d", N, &B);

	for(int i=strlen(N)-1;i>=0;i--)
	{
		if(isdigit(N[i]))
			decimal+=power*(N[i]-'0');
		else
			decimal+=power*(N[i]-'A'+10);

		power*=B;
	}

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

문제

어느 날, 미르코는 우연히 길거리에서 양수 N을 보았다. 미르코는 30이란 수를 존경하기 때문에, 그는 길거리에서 찾은 수에 포함된 숫자들을 섞어 30의 배수가 되는 가장 큰 수를 만들고 싶어한다.

미르코를 도와 그가 만들고 싶어하는 수를 계산하는 프로그램을 작성하라.

입력

N을 입력받는다. N는 최대 10^5개의 숫자로 구성되어 있으며, 0으로 시작하지 않는다.

출력

미르코가 만들고 싶어하는 수가 존재한다면 그 수를 출력하라. 그 수가 존재하지 않는다면, -1을 출력하라.

예제 입력 1

30

예제 출력 1

30

예제 입력 2

102

예제 출력 2

210

예제 입력 3

2931

예제 출력 3

-1

예제 입력 4

80875542

예제 출력 4

88755420

더보기

Solution

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

int main(void)
{
	char N[100001]={'\0', };
	int count[10]={0, }, sum=0;

	scanf("%s", N);

	for(int i=0;i<strlen(N);i++)
		count[N[i]-'0']++;

	for(int i=1;i<10;i++)
		sum+=i*count[i];

	if(sum%3!=0 || count[0]==0)
		printf("-1\n");
	else
	{
		for(int i=9;i>=0;i--)
			for(int j=0;j<count[i];j++)
				printf("%d", i);
		printf("\n");
	}

	return 0;
}
728x90

문제

1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.

1234567891011121314151617181920212223...

이렇게 만들어진 새로운 수는 몇 자리 수일까? 이 수의 자릿수를 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 새로운 수의 자릿수를 출력한다.

예제 입력 1

120

예제 출력 1

252

더보기

Solution

#include<stdio.h>

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

	scanf("%d", &N);

	for(int i=1;i<=N;i++)
		if(i<10)
			count++;
		else if(i<100)
			count+=2;
		else if(i<1000)
			count+=3;
		else if(i<10000)
			count+=4;
		else if(i<100000)
			count+=5;
		else if(i<1000000)
			count+=6;
		else if(i<10000000)
			count+=7;
		else if(i<100000000)
			count+=8;
		else
			count+=9;

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

문제

1에서부터 6까지의 눈을 가진 4개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다. 

  1. 같은 눈이 4개가 나오면 50,000원+(같은 눈)*5,000원의 상금을 받게 된다. 
  2. 같은 눈이 3개만 나오면 10,000원+(3개가 나온 눈)*1,000원의 상금을 받게 된다. 
  3. 같은 눈이 2개씩 두 쌍이 나오는 경우에는 2,000원+(2개가 나온 눈)*500원+(또 다른 2개가 나온 눈)*500원의 상금을 받게 된다.
  4. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)*100원의 상금을 받게 된다. 
  5. 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)*100원의 상금을 받게 된다.  

예를 들어, 4개의 눈이 3, 3, 3, 3으로 주어지면 50,000+3*5,000으로 계산되어 65,000원의 상금을 받게 된다. 4개의 눈이 3, 3, 6, 3으로 주어지면 상금은 10,000+3*1,000으로 계산되어 13,000원을 받게 된다. 또 4개의 눈이 2, 2, 6, 6으로 주어지면 2,000+2*500+6*500으로 계산되어 6,000원을 받게 된다. 4개의 눈이 6, 2, 1, 6으로 주어지면 1,000+6*100으로 계산되어 1,600원을 받게 된다. 4개의 눈이 6, 2, 1, 5로 주어지면 그 중 가장 큰 값이 6이므로 6*100으로 계산되어 600원을 상금으로 받게 된다.

N(1≤N≤1,000)명이 주사위 게임에 참여하였을 때, 가장 많은 상금을 받은 사람의 상금을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에는 참여하는 사람 수 N이 주어지고 그 다음 줄부터 N개의 줄에 사람들이 주사위를 던진 4개의 눈이 빈칸을 사이에 두고 각각 주어진다.

출력

첫째 줄에 가장 많은 상금을 받은 사람의 상금을 출력한다.

예제 입력 1

4
3 3 3 3
3 3 6 3
2 2 6 6
6 2 1 5

예제 출력 1

65000

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N, price, maxprice=0, dice[4];

	scanf("%d", &N);

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

		for(int i=0;i<3;i++)
			for(int j=i+1;j<4;j++)
				if(dice[i]>dice[j])
				{
					int temp=dice[i];
					dice[i]=dice[j];
					dice[j]=temp;
				}

		if(dice[0]==dice[3])
			price=50000+dice[0]*5000;
		else if(dice[0]==dice[2] || dice[1]==dice[3])
			price=10000+dice[1]*1000;
		else if(dice[0]==dice[1] && dice[2]==dice[3])
			price=2000+500*(dice[1]+dice[2]);
		else if(dice[0]==dice[1] || dice[1]==dice[2])
			price=1000+dice[1]*100;
		else
			price=100*dice[3]+1000*(dice[2]==dice[3]);

		maxprice=price>maxprice?price:maxprice;
	}

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

문제

독일 로또는 {1, 2, ..., 49}에서 수 6개를 고른다.

로또 번호를 선택하는데 사용되는 가장 유명한 전략은 49가지 수 중 k(k>6)개의 수를 골라 집합 S를 만든 다음 그 수만 가지고 번호를 선택하는 것이다.

예를 들어, k=8, S={1,2,3,5,8,13,21,34}인 경우 이 집합 S에서 수를 고를 수 있는 경우의 수는 총 28가지이다. ([1,2,3,5,8,13], [1,2,3,5,8,21], [1,2,3,5,8,34], [1,2,3,5,13,21], ..., [3,5,8,13,21,34])

집합 S와 k가 주어졌을 때, 수를 고르는 모든 방법을 구하는 프로그램을 작성하시오.

입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있다. 첫 번째 수는 k (6 < k < 13)이고, 다음 k개 수는 집합 S에 포함되는 수이다. S의 원소는 오름차순으로 주어진다.

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

출력

각 테스트 케이스마다 수를 고르는 모든 방법을 출력한다. 이때, 사전 순으로 출력한다.

각 테스트 케이스 사이에는 빈 줄을 하나 출력한다.

예제 입력 1

7 1 2 3 4 5 6 7
8 1 2 3 5 8 13 21 34
0

예제 출력 1

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

1 2 3 5 8 13
1 2 3 5 8 21
1 2 3 5 8 34
1 2 3 5 13 21
1 2 3 5 13 34
1 2 3 5 21 34
1 2 3 8 13 21
1 2 3 8 13 34
1 2 3 8 21 34
1 2 3 13 21 34
1 2 5 8 13 21
1 2 5 8 13 34
1 2 5 8 21 34
1 2 5 13 21 34
1 2 8 13 21 34
1 3 5 8 13 21
1 3 5 8 13 34
1 3 5 8 21 34
1 3 5 13 21 34
1 3 8 13 21 34
1 5 8 13 21 34
2 3 5 8 13 21
2 3 5 8 13 34
2 3 5 8 21 34
2 3 5 13 21 34
2 3 8 13 21 34
2 5 8 13 21 34
3 5 8 13 21 34

더보기

Solution

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

int main(void)
{
	int k;

	scanf("%d", &k);

	while(k!=0)
	{
		int order[6], *S=malloc(k*sizeof(int));

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

		for(order[0]=0;order[0]<k-5;order[0]++)
			for(order[1]=order[0]+1;order[1]<k;order[1]++)
				for(order[2]=order[1]+1;order[2]<k;order[2]++)
					for(order[3]=order[2]+1;order[3]<k;order[3]++)
						for(order[4]=order[3]+1;order[4]<k;order[4]++)
							for(order[5]=order[4]+1;order[5]<k;order[5]++)
							{
								for(int i=0;i<6;i++)
									printf("%d ", S[order[i]]);
								printf("\n");
							}

		printf("\n");
		free(S);
		scanf("%d", &k);
	}

	return 0;
}
728x90

문제

어떤 수들이 있을 때, 그 수들을 대표하는 값으로 가장 흔하게 쓰이는 것은 평균이다. 평균은 주어진 모든 수의 합을 수의 개수로 나눈 것이다. 예를 들어 10, 40, 30, 60, 30, 20, 60, 30, 40, 50의 평균은

 

이 된다.

평균 이외의 또 다른 대표값으로 최빈값이라는 것이 있다. 최빈값은 주어진 수들 가운데 가장 많이 나타나는 수이다. 예를 들어 10, 40, 30, 60, 30, 20, 60, 30, 40, 50 이 주어질 경우,

30 이 세 번,

40 과 60 이 각각 두 번,

10, 20, 50 이 각각 한 번씩 나오므로, 최빈값은 30 이 된다.

열 개의 자연수가 주어질 때 이들의 평균과 최빈값을 구하는 프로그램을 작성하시오.

입력

첫째 줄부터 열 번째 줄까지 한 줄에 하나씩 자연수가 주어진다. 주어지는 자연수는 1,000 보다 작은 10 의 배수이다.

출력

첫째 줄에는 평균을 출력하고, 둘째 줄에는 최빈값을 출력한다. 최빈값이 둘 이상일 경우 그 중 하나만 출력한다. 평균과 최빈값은 모두 자연수이다.

예제 입력 1

10
40
30
60
30
20
60
30
40
50

예제 출력 1

37
30

더보기

Solution

#include<stdio.h>

int main(void)
{
	int frequency[100]={0, }, average=0, number;

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

		average+=number/10;
		frequency[number/10]++;
	}

	number=0;
	for(int i=1;i<100;i++)
		number=frequency[number]>frequency[i]?number:i;

	printf("%d\n%d\n", average, number*10);
	return 0;
}
728x90

+ Recent posts