문제

백준 문제 풀이에 힘들어하는 수진이를 위해 민우는 문제해결에 도움이 되는 고무오리를 준비했다. 민우가 준비한 고무오리는 신비한 능력이 존재하는데, 최근에 풀던 백준 문제를 해결해주는 능력이다. 신비한 고무오리와 함께 수진이의 백준 풀이를 도와주자! 고무오리의 사용법은 다음과 같다 - "고무오리 디버깅 시작" 이라고 외친다 - 문제들을 풀기 시작한다 - 고무오리를 받으면 최근 풀던 문제를 해결한다 - "고무오리 디버깅 끝" 이라고 외치면 문제풀이를 종료한다. 하지만 고무오리에는 치명적인 문제가 있는데, 풀 문제가 없는데 사용한다면 고무오리는 체벌로 두 문제를 추가한다는 점이다.

입력

첫 번째 줄에 "고무오리 디버깅 시작"이라고 주어진다. 두 번째 줄부터 "고무오리" 또는 "문제"가 주어진다. 이는 "고무오리 디버깅 끝"이 주어질 때까지 반복한다.

출력

고무오리 디버깅이 끝날 때, 주어진 문제를 수진이가 해결하였는지 여부에 따라 남은 문제 없이 모든 문제를 해결하였으면 "고무오리야 사랑해"을 출력하고 하나라도 문제가 남았다면 "힝구"를 출력하라.

예제 입력 1

고무오리 디버깅 시작
문제
고무오리
문제
문제
고무오리
고무오리
고무오리 디버깅 끝

예제 출력 1

고무오리야 사랑해

예제 입력 2

고무오리 디버깅 시작
고무오리
고무오리
고무오리
고무오리 디버깅 끝

예제 출력 2

고무오리야 사랑해

예제 입력 3

고무오리 디버깅 시작
문제
문제
고무오리
고무오리
고무오리
문제
고무오리
문제
고무오리
고무오리
고무오리
고무오리 디버깅 끝

예제 출력 3

고무오리야 사랑해

예제 입력 4

고무오리 디버깅 시작
고무오리
고무오리 디버깅 끝

예제 출력 4

힝구

더보기

Solution

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

int main(void)
{
	int problem=0;

	while(1)
	{
		char str[30]={'\0', };

		fgets(str,sizeof(str),stdin);

		if(strncmp(str,"문제\n",7)==0)
			problem++;
		else if(strncmp(str,"고무오리\n",13)==0)
			problem+=problem>0?-1:2;
		else if(strncmp(str,"고무오리 디버깅 끝\n",27)==0)
			break;
	}

	printf("%s\n", problem==0?"고무오리야 사랑해":"힝구");
	return 0;
}

 

728x90

문제

상근이는 창고에서 링 N개를 발견했다. 상근이는 각각의 링이 앞에 있는 링과 뒤에 있는 링과 접하도록 바닥에 내려놓았다. 

상근이는 첫 번째 링을 돌리기 시작했고, 나머지 링도 같이 돌아간다는 사실을 발견했다. 나머지 링은 첫 번째 링 보다 빠르게 돌아가기도 했고, 느리게 돌아가기도 했다. 이렇게 링을 돌리다 보니 첫 번째 링을 한 바퀴 돌리면, 나머지 링은 몇 바퀴 도는지 궁금해졌다.

링의 반지름이 주어진다. 이때, 첫 번째 링을 한 바퀴 돌리면, 나머지 링은 몇 바퀴 돌아가는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 링의 개수 N이 주어진다. (3 ≤ N ≤ 100)

다음 줄에는 링의 반지름이 상근이가 바닥에 놓은 순서대로 주어진다. 반지름은 1과 1000를 포함하는 사이의 자연수이다.

출력

출력은 총 N-1줄을 해야 한다. 첫 번째 링을 제외한 각각의 링에 대해서, 첫 번째 링을 한 바퀴 돌리면 그 링은 몇 바퀴 도는지 기약 분수 형태 A/B로 출력한다.

예제 입력 1

4
12 3 8 4

예제 출력 1

4/1
3/2
3/1

더보기

Solution

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

int gcd(int x,int y)
{
	if(x<y)
	{
		int temp=x;
		x=y;
		y=temp;
	}

	while(y!=0)
	{
		int temp=x%y;
		x=y;
		y=temp;
	}

	return x;
}

int main(void)
{
	int N, *radius=NULL;

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

	for(int i=1;i<N;i++)
		printf("%d/%d\n", radius[0]/gcd(radius[0],radius[i]),radius[i]/gcd(radius[0],radius[i]));
	free(radius);
	return 0;
}
728x90

문제

준규가 사는 나라는 우리가 사용하는 연도와 다른 방식을 이용한다. 준규가 사는 나라에서는 수 3개를 이용해서 연도를 나타낸다. 각각의 수는 지구, 태양, 그리고 달을 나타낸다.

지구를 나타내는 수를 E, 태양을 나타내는 수를 S, 달을 나타내는 수를 M이라고 했을 때, 이 세 수는 서로 다른 범위를 가진다. (1 ≤ E ≤ 15, 1 ≤ S ≤ 28, 1 ≤ M ≤ 19)

우리가 알고있는 1년은 준규가 살고있는 나라에서는 1 1 1로 나타낼 수 있다. 1년이 지날 때마다, 세 수는 모두 1씩 증가한다. 만약, 어떤 수가 범위를 넘어가는 경우에는 1이 된다.

예를 들어, 15년은 15 15 15로 나타낼 수 있다. 하지만, 1년이 지나서 16년이 되면 16 16 16이 아니라 1 16 16이 된다. 이유는 1 ≤ E ≤ 15 라서 범위를 넘어가기 때문이다.

E, S, M이 주어졌고, 1년이 준규가 사는 나라에서 1 1 1일때, 준규가 사는 나라에서 E S M이 우리가 알고 있는 연도로 몇 년인지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 세 수 E, S, M이 주어진다. 문제에 나와있는 범위를 지키는 입력만 주어진다.

출력

첫째 줄에 E S M으로 표시되는 가장 빠른 연도를 출력한다. 1 1 1은 항상 1이기 때문에, 정답이 음수가 나오는 경우는 없다.

예제 입력 1

1 16 16

예제 출력 1

16

예제 입력 2

1 1 1

예제 출력 2

1

예제 입력 3

1 2 3

예제 출력 3

5266

예제 입력 4

15 28 19

예제 출력 4

7980

더보기

Solution

#include<stdio.h>

int main(void)
{
	int E, S, M, year;

	scanf("%d %d %d", &E, &S, &M);

	for(year=1;(year-1)%15+1!=E||(year-1)%28+1!=S||(year-1)%19+1!=M;year++);

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

문제

동호는 내년에 초등학교를 입학한다. 그래서 동호 어머니는 수학 선행 학습을 위해 쉽게 푸는 문제를 동호에게 주었다.

이 문제는 다음과 같다. 1을 한 번, 2를 두 번, 3을 세 번, 이런 식으로 1 2 2 3 3 3 4 4 4 4 5 .. 이러한 수열을 만들고 어느 일정한 구간을 주면 그 구간의 합을 구하는 것이다.

하지만 동호는 현재 더 어려운 문제를 푸느라 바쁘기에 우리가 동호를 도와주자.

입력

첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1≤A≤B≤1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다.

출력

첫 줄에 구간에 속하는 숫자의 합을 출력한다.

예제 입력 1

3 7

예제 출력 1

15

더보기

Solution

#include<stdio.h>

int main(void)
{
	int A, B, current=1, count=0, sum=0;

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

	for(int i=1;i<=B;i++)
	{
		if(i>=A)
			sum+=current;
		count++;
		if(count==current)
		{
			current++;
			count=0;
		}
	}

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

문제

N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i]+A[i+1]+…+A[j-1]+A[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N(1≤N≤10,000), M(1≤M≤300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

출력

첫째 줄에 경우의 수를 출력한다.

예제 입력 1

4 2
1 1 1 1

예제 출력 1

3

예제 입력 2

10 5
1 2 3 4 2 5 3 1 1 2

예제 출력 2

3

더보기

Solution

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

int main(void)
{
	int N, *A=NULL, M, count=0;

	scanf("%d %d", &N, &M);
	A=(int *)malloc(N*sizeof(int));
	for(int i=0;i<N;i++)
		scanf("%d", &A[i]);

	for(int i=0;i<N;i++)
	{
		int sum=0;

		for(int j=i;j<N&&sum<M;j++)
			sum+=A[j];
		count+=sum==M;
	}

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

문제

어떠한 자연수 N은, 몇 개의 연속된 자연수의 합으로 나타낼 수 있다. 당신은 어떤 자연수 N(1≤N≤10,000,000)에 대해서, 이 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 알고 싶어한다. 이때, 사용하는 자연수는 N이하여야 한다.

예를 들어, 15를 나타내는 방법은 15, 7+8, 4+5+6, 1+2+3+4+5의 4가지가 있다. 반면에 10을 나타내는 방법은 10, 1+2+3+4의 2가지가 있다.

N을 입력받아 가지수를 출력하는 프로그램을 작성하시오.

입력

첫 줄에 정수 N이 주어진다.

출력

입력된 자연수 N을 몇 개의 연속된 자연수의 합으로 나타내는 가지수를 출력하시오

예제 입력 1

15

예제 출력 1

4

더보기

Solution

#include<stdio.h>

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

	scanf("%d", &N);

	for(int i=1;i<=N;i++)
	{
		int sum=i;

		for(int j=i+1;sum<N;j++)
			sum+=j;
		count+=sum==N;
	}

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

문제

2진수가 주어졌을 때, 8진수로 변환하는 프로그램을 작성하시오.

입력

첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 주어진 수를 8진수로 변환하여 출력한다.

예제 입력 1

11001100

예제 출력 1

314

더보기

Solution

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

int main(void)
{
	int N;
	char binary[2][1000002]={'\0', }, octal[333335]={'\0', };

	scanf("%s", binary[0]);

	if(strlen(binary[0])%3==0)
		strcpy(binary[1],binary[0]);
	else if(strlen(binary[0])%3==1)
		sprintf(binary[1], "00%s", binary[0]);
	else
		sprintf(binary[1], "0%s", binary[0]);

	N=strlen(binary[1]);
	for(int i=0;i<N;i+=3)
		octal[i/3]='0'+4*(binary[1][i]=='1')+2*(binary[1][i+1]=='1')+(binary[1][i+2]=='1');

	printf("%s\n", octal);
	return 0;
}
728x90

문제

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

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

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

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.

출력

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

예제 입력 1

60466175 36

예제 출력 1

ZZZZZ

더보기

Solution

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

int main(void)
{
	int N, B;
	char ans[32]={'\0', };

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

	for(int i=0;N>0;i++)
	{
		ans[i]=N%B>9?N%B+'A'-10:N%B+'0';
		N/=B;
	}

	for(int i=0;i<strlen(ans)/2;i++)
	{
		char temp=ans[i];
		ans[i]=ans[strlen(ans)-1-i];
		ans[strlen(ans)-1-i]=temp;
	}

	printf("%s\n", ans);
	return 0;
}
728x90

+ Recent posts