문제

하루에 한 번 산을 넘어가는 떡 장사 할머니는 호랑이에게 떡을 주어야 산을 넘어갈 수 있는데, 욕심 많은 호랑이는 어제 받은 떡의 개수와 그저께 받은 떡의 개수를 더한 만큼의 떡을 받아야만 할머니를 무사히 보내 준다고 한다. 

예를 들어 첫째 날에 떡을 1개 주었고, 둘째 날에는 떡을 2개 주었다면 셋째 날에는 1+2=3개, 넷째 날에는 2+3=5개, 다섯째 날에는 3+5=8개, 여섯째 날에는 5+8=13개를 주어야만 무사히 산을 넘어갈 수 있다. 

우리는 산을 무사히 넘어온 할머니에게 오늘 호랑이에게 몇 개의 떡을 주었는지, 그리고 오늘이 호랑이를 만나 떡을 준지 며칠이 되었는지를 알아내었다. 할머니가 호랑이를 만나서 무사히 넘어온 D째 날에 준 떡의 개수가 K개임을 알 때, 여러분은 할머니가 호랑이를 처음 만난 날에  준 떡의 개수 A, 그리고 그 다음 날에 호랑이에게 준 떡의 개수 B를 계산하는 프로그램을 작성하시오. 이 문제에서는 항상 1≤A≤B 이다.  

예를 들어 여섯 번째 날에 산을 무사히 넘어온 할머니가 호랑이에게 준 떡이 모두 41개라면, 호랑이를 만난 첫 날에 준 떡의 수는 2개, 둘째 날에 준 떡의 수는 7개이다. 즉 셋째 날에는 9개, 넷째 날에는 16개, 다섯째 날에는 25개, 여섯째  날에는 41개이다. 따라서 A=2, B=7 이 된다. 단 어떤 경우에는 답이 되는 A, B가 하나 이상일 때도 있는데 이 경우에는 그 중 하나만 구해서 출력하면 된다.

입력

첫째 줄에는 할머니가 넘어온 날 D (3 ≤ D ≤ 30)와 그 날 호랑이에게 준 떡의 개수 K (10 ≤ K ≤ 100,000)가 하나의 빈칸을 사이에 두고 주어진다. 

출력

첫줄에 첫 날에 준 떡의 개수 A를 출력하고 그 다음 둘째 줄에는 둘째 날에 준 떡의 개수 B를 출력한다. 이 문제에서 주어진 D, K에 대해서는 항상 정수 A, B (1≤A≤B)가 존재한다. 

예제 입력 1

6 41

예제 출력 1

2
7

더보기

Solution

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

int main(void)
{
	int DA[31]={0,1,0,1,1,}, DB[31]={0,0,1,1,2,}, D, K;
	bool solved=false;

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

	for(int d=5;d<=D;d++)
	{
		DA[d]=DA[d-1]+DA[d-2];
		DB[d]=DB[d-1]+DB[d-2];
	}

	for(int A=1;2*A*DA[D]<=K;A++)
	{
		for(int B=A;A*DA[D]+B*DB[D]<=K;B++)
			if(A*DA[D]+B*DB[D]==K)
			{
				printf("%d\n%d\n", A, B);
				solved=true;
				break;
			}
		if(solved)
			break;
	}

	return 0;
}
728x90

문제

소수를 매우 좋아하는 수학자가 있다. 이 수학자는 매번 전화번호를 받을 때 마다, 그 전화번호가 소수인지 아닌지를 검사한다. 수학자는 자신의 모든 친구의 전화번호가 소수인지 아닌지를 기억하고 있다.

계속해서 늘어나는 휴대전화 인구의 급증에 따라 정부는 한 자리를 기존 번호 앞에 붙이는 정책을 시행하기로 했다.

수학자는 큰 고민에 빠졌다. 소수 전화번호를 가지고 있는 친구의 전화번호가 이제 평범한 숫자가 될 수도 있기 때문이다.

수학자의 친구 중 한 사람의 원래 전화번호와 새로이 앞에 붙는 번호 한 자리가 주어졌을 때, 원래 전화번호와 새로운 전화번호가 모두 소수인지 아닌지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 여섯 자리의 기존 전화번호와 새로 추가되는 한 자리 번호가 주어진다. 기존 전화번호는 0으로 시작하지 않으며, 새로 추가되는 한 자리 번호는 0이 아니다.

출력

원래 전화번호와 새로운 전화번호가 소수이면 Yes를, 아니면 No를 출력한다.

예제 입력 1

946859 2

예제 출력 1

Yes

더보기

Solution

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

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

int main(void)
{
	int old, new;

	scanf("%d %d", &old, &new);

	new=1000000*new+old;

	printf("%s\n", isPrime(old)&&isPrime(new)?"Yes":"No");
	return 0;
}
728x90

문제

엑셀 프로그램은 각 열의 순서를 알파벳 조합으로 구분한다. 예를 들어, 열의 순서와 각 열을 나타내는 문자열은 다음과 같다.

열 문자열 A B C X Y Z AA AB AC AZ BA
열 순서 1 2 3 24 25 26 27 28 29 52 53

열 문자열이 주어졌을 때 이에 대한 열 순서를 반환하는 코드를 작성하라.

입력

첫째 줄에 1개 이상의 알파벳 대문자로 이루어진 열 문자열이 주어진다. 입력 문자열의 길이는 10을 넘지 않는다.

출력

첫째 줄에 열 순서를 출력한다.

예제 입력 1

X

예제 출력 1

24

예제 입력 2

AZ

예제 출력 2

52

더보기

Solution

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

int main(void)
{
	long int order=0;
	char str[11]={'\0', };

	scanf("%s", str);

	for(int i=0;i<strlen(str);i++)
	{
		order*=26;
		order+=str[i]-'A'+1;
	}

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

문제

According to Wikipedia, FizzBuzz is a group word game for children to teach them about division. This may or may not be true, but this question is generally used to torture screen young computer science graduates during programming interviews.

Basically, this is how it works: you print the integers from 1 to N, replacing any of them divisible by X with Fizz or, if they are divisible by Y , with Buzz. If the number is divisible by both X and Y , you print FizzBuzz instead.

Check the samples for further clarification.

입력

Input file will contain a single test case. Each test case will contain three integers on a single line, X, Y and N (1 ≤ X < Y ≤ N ≤ 100).

출력

Print integers from 1 to N in order, each on its own line, replacing the ones divisible by X with Fizz, the ones divisible by Y with Buzz and ones divisible by both X and Y with FizzBuzz.

예제 입력 1

2 3 7

예제 출력 1

1
Fizz
Buzz
Fizz
5
FizzBuzz
7

예제 입력 2

2 4 7

예제 출력 2

1
Fizz
3
FizzBuzz
5
Fizz
7

예제 입력 3

3 5 7

예제 출력 3

1
2
Fizz
4
Buzz
Fizz
7

더보기

Solution

#include<stdio.h>

int main(void)
{
	int X, Y, N;

	scanf("%d %d %d", &X, &Y, &N);

	for(int n=1;n<=N;n++)
		if(n%X==0 && n%Y==0)
			printf("FizzBuzz\n");
		else if(n%X==0)
			printf("Fizz\n");
		else if(n%Y==0)
			printf("Buzz\n");
		else
			printf("%d\n", n);

	return 0;
}
728x90

문제

아무래도 우리 팀 다리우스가 고수인 것 같다. 그의 K/D/A를 보고 그가 「진짜」인지 판별해 보자.

K+A<D이거나, D=0이면 그는 「가짜」이고, 그렇지 않으면 「진짜」이다.

입력

K/D/A가 주어진다.

출력

그가 「진짜」이면 gosu, 「가짜」이면 hasu를 출력한다.

제한

0≤K,D,A≤20

예제 입력 1

0/5/3

예제 출력 1

hasu

예제 입력 2

12/4/5

예제 출력 2

gosu

예제 입력 3

0/0/1

예제 출력 3

hasu

더보기

Solution

#include<stdio.h>

int main(void)
{
	int K, D, A;

	scanf("%d/%d/%d", &K, &D, &A);

	printf("%s\n", K+A<D||D==0?"hasu":"gosu");
	return 0;
}
728x90

문제

입력 받은 대로 출력하는 프로그램을 작성하시오.

입력

입력이 주어진다. 입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다. 각 줄은 100글자를 넘지 않으며, 빈 줄이 주어질 수도 있고, 각 줄의 앞 뒤에 공백이 있을 수도 있다.

출력

입력받은 그대로 출력한다.

예제 입력 1

    Hello

Baekjoon     
   Online Judge    

예제 출력 1

    Hello

Baekjoon     
   Online Judge    

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N=0;
	char str[100][100]={'\0'};

	while(gets(str[N])!=NULL)
		puts(str[N++]);
 
	return 0;
}
728x90

문제

세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로 옮기려 한다.

  1. 한 번에 한 개의 원판만을 다른 탑으로 옮길 수 있다.
  2. 쌓아 놓은 원판은 항상 위의 것이 아래의 것보다 작아야 한다.

이 작업을 수행하는데 필요한 이동 순서를 출력하는 프로그램을 작성하라. 단, 이동 횟수는 최소가 되어야 한다.

아래 그림은 원판이 5개인 경우의 예시이다.

입력

첫째 줄에 첫 번째 장대에 쌓인 원판의 개수 N (1 ≤ N ≤ 20)이 주어진다.

 

출력

첫째 줄에 옮긴 횟수 K를 출력한다.

두 번째 줄부터 수행 과정을 출력한다. 두 번째 줄부터 K개의 줄에 걸쳐 두 정수 A B를 빈칸을 사이에 두고 출력하는데, 이는 A번째 탑의 가장 위에 있는 원판을 B번째 탑의 가장 위로 옮긴다는 뜻이다.

예제 입력 1

3

예제 출력 1

7
1 3
1 2
3 2
1 3
2 1
2 3
1 3

더보기

Solution

#include<stdio.h>

int N=1;

void moveHanoiquietly(int from,int temp,int to,int n)
{
	if(n==1)
		N++;
	else
	{
		moveHanoiquietly(from,to,temp,n-1);
		N++;
		moveHanoiquietly(temp,from,to,n-1);
	}
}

void moveHanoi(int from,int temp,int to,int n)
{
	if(n==1)
	{
		N++;
		printf("%d %d\n",from, to);
	}
	else
	{
		moveHanoi(from,to,temp,n-1);
		N++;
		printf("%d %d\n", from, to);
		moveHanoi(temp,from,to,n-1);
	}
}

int main(void)
{
	int n;

	scanf("%d", &n);

	moveHanoiquietly(1,2,3,n);
	printf("%d\n", --N);
	N=1;
	moveHanoi(1,2,3,n);

	return 0;
}
728x90

문제

Meredith runs a taxi service called Ruber which offers rides to clients in small towns in western Pennsylvania. She wants to get every possible dime out of people who use her taxis, so her drivers charge a flat fee not per minute but per second. It’s important, therefore, to be able to determine the exact amount of elapsed time between the moment a client enters a cab until the moment they leave. Trying to write a program to do this has driven Meredith crazy (pun intended) so she’s come to you for some help.

입력

Input consists of two lines: the first contains the start time and the second contains the end time for a single taxi ride. Each time is of the form hh : mm : ss, giving the hour, minute and seconds. Meredith uses a 24 hour clock, with 0 : 0 : 0 representing 12 midnight and 23 : 59 : 59 representing one second before midnight. Note that the end time may have a value less than the start time value if the ride spans midnight (see the last sample test case for an example of this).

출력

Display the number of seconds between the two times. No cab ride will be equal to or longer than 24 hours.

예제 입력 1

10 : 0 : 0
11 : 0 : 0

예제 출력 1

3600

예제 입력 2

13 : 30 : 52
13 : 31 : 7

예제 출력 2

15

예제 입력 3

23 : 0 : 0
1 : 30 : 0

예제 출력 3

9000

더보기

Solution

#include<stdio.h>

int main(void)
{
	int time[2][3], ride=0;

	for(int i=0;i<2;i++)
		scanf("%d : %d : %d", &time[i][0], &time[i][1], &time[i][2]);

	for(int t=2;t>0;t--)
		if(time[0][t]>time[1][t])
		{
			time[1][t]+=60;
			time[1][t-1]--;
		}
	if(time[0][0]>time[1][0])
		time[1][0]+=24;

	for(int i=2,gap=1;i>=0;i--,gap*=60)
		ride+=gap*(time[1][i]-time[0][i]);

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

+ Recent posts