문제

C언어는 int형 변수를 32개의 bit를 이용하여 2의 보수 방식을 따라서 이진수의 형태로 저장한다.

즉, 정수 10은 0000 0000 0000 0000 0000 0000 0000 1010으로 저장된다.

하지만 세상을 뒤흔들 새로운 언어 CC는 메모리를 줄이기 위해 int형 변수를 저장할 때 앞에서부터 연속된 0은 저장하지 않는다. 즉, 정수 10은 1010으로 저장된다. 그 외에 저장하는 방법은 C언어와 같다.

정수 n을 CC에 저장하는데 필요한 bit의 개수를 출력하여라. 단, n이 0일 때는 1개의 bit를 사용하여 0을 저장한다.

입력

언어 CC에 저장할 n이 주어진다.

출력

변수 n을 저장하는데 필요한 bit의 개수를 출력한다.

제한

  • -2,147,483,648 ≤ n ≤ 2,147,483,647

예제 입력 1

10

예제 출력 1

4

더보기

Solution

#include<stdio.h>

int main(void)
{
	int n, bit=1, count=0;

	scanf("%d", &n);

	if(n<0)
		printf("32\n");
	else if(n<2)
		printf("1\n");
	else
	{
		while(bit<=n)
		{
			count++;
			bit*=2;
		}

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

	return 0;
}
728x90

문제

스타워즈 로고를 예제 출력과 같이 출력하는 프로그램을 작성하시오.

출력

스타워즈 로고를 출력한다.

예제 입력 1

 

예제 출력 1

    8888888888  888    88888
   88     88   88 88   88  88
    8888  88  88   88  88888
       88 88 888888888 88   88
88888888  88 88     88 88    888888

88  88  88   888    88888    888888
88  88  88  88 88   88  88  88
88 8888 88 88   88  88888    8888
 888  888 888888888 88  88      88
  88  88  88     88 88   88888888

더보기

Solution

#include<stdio.h>

int main(void)
{
	printf("    8888888888  888    88888\n");
	printf("   88     88   88 88   88  88\n");
	printf("    8888  88  88   88  88888\n");
	printf("       88 88 888888888 88   88\n");
	printf("88888888  88 88     88 88    888888\n\n");
	printf("88  88  88   888    88888    888888\n");
	printf("88  88  88  88 88   88  88  88\n");
	printf("88 8888 88 88   88  88888    8888\n");
	printf(" 888  888 888888888 88  88      88\n");
	printf("  88  88  88     88 88   88888888\n");

	return 0;
}
728x90

문제

분수 A/B는 분자가 A, 분모가 B인 분수를 의미한다. A와 B는 모두 자연수라고 하자.

두 분수의 합 또한 분수로 표현할 수 있다. 두 분수가 주어졌을 때, 그 합을 기약분수의 형태로 구하는 프로그램을 작성하시오. 기약분수란 더 이상 약분되지 않는 분수를 의미한다.

입력

첫째 줄과 둘째 줄에, 각 분수의 분자와 분모를 뜻하는 두 개의 자연수가 순서대로 주어진다. 입력되는 네 자연수는 모두 30,000 이하이다.

출력

첫째 줄에 구하고자 하는 기약분수의 분자와 분모를 뜻하는 두 개의 자연수를 빈 칸을 사이에 두고 순서대로 출력한다.

예제 입력 1

2 7
3 5

예제 출력 1

31 35

더보기

Solution

#include<stdio.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 lcm(int x,int y)
{
	return x*y/gcd(x,y);
}

int main(void)
{
	int A[2], B[2], C;

	for(int i=0;i<2;i++)
		scanf("%d %d", &A[i], &B[i]);

	for(int i=0;i<2;i++)
		A[i]*=lcm(B[0],B[1])/B[i];
	B[0]=B[1]=lcm(B[0],B[1]);

	A[0]+=A[1];

	C=gcd(A[0],B[0]);
	A[0]/=C;
	B[0]/=C;

	printf("%d %d\n", A[0], B[0]);

	return 0;
}
728x90

문제

상근이는 길을 걷다가 신기한 기계를 발견했다. 기계는 매우 매우 큰 화면과 버튼 하나로 이루어져 있다.

기계를 발견했을 때, 화면에는 A만 표시되어져 있었다. 버튼을 누르니 글자가 B로 변했다. 한 번 더 누르니 BA로 바뀌고, 그 다음에는 BAB, 그리고 BABBA로 바뀌었다. 상근이는 화면의 모든 B는 BA로 바뀌고, A는 B로 바뀐다는 사실을 알게되었다.

버튼을 K번 눌렀을 때, 화면에 A와 B의 개수는 몇 개가 될까?

입력

첫째 줄에 K (1 ≤ K ≤ 45)가 주어진다.

출력

첫째 줄에 A의 개수와 B의 개수를 공백으로 구분해 출력한다.

예제 입력 1

1

예제 출력 1

0 1

더보기

Solution

#include<stdio.h>

int main(void)
{
	int A=1, B=0, K;

 	scanf("%d", &K);

	for(int i=0;i<K;i++)
	{
		int temp=B;
		B+=A;
		A=temp;
	}

	printf("%d %d\n", A, B);

	return 0;
}
728x90

문제

파스칼의 삼각형은 이항계수를 삼각형 형태로 배열한 것인데, 블레즈 파스칼(1623-1662)을 따라 이름 붙여졌다.

단순한 형태로, 파스칼의 삼각형은 다음과 같은 방법으로 만들 수 있다.

  1. N번째 행에는 N개의 수가 있다.
  2. 첫 번째 행은 1이다.
  3. 두 번째 행부터, 각 행의 양 끝의 값은 1이고, 나머지 수의 값은 바로 위 행의 인접한 두 수의 합이다.

예를 들어, n=3이면 3번째 행의 2번째 수는 위 행의 인접한 두 수 (1과 1)을 더해서 만든다. 

n=6일 때, 파스칼 삼각형의 6번째 행의 10은 5번째 행의 인접한 두 수(4와 6)을 더해서 구한다. 

같은 방식으로 n=11일 때, 다음과 같은 파스칼의 삼각형을 만들 수 있다.

정수 n과 k가 주어졌을 때 파스칼의 삼각형에 있는 n번째 행에서 k번째 수를 출력하는 프로그램을 작성하시오.  이때, 이 수는 이항계수 C(n-1,k-1)임에 주의하시오.

입력

첫째 줄에 정수 n과 k가 빈칸을 사이에 두고 차례로 주어진다. 이 때, 1 ≤ k ≤ n ≤ 30을 만족한다.

출력

첫째 줄에 n번째 행에 있는 k번째 수를 출력한다.

예제 입력 1

5 3

예제 출력 1

6

예제 입력 2

11 3

예제 출력 2

45

더보기

Solution

#include<stdio.h>

int main(void)
{
	long double factorial[30]={1.0, };
	int n, k;

	scanf("%d %d", &n, &k);

	for(int i=1;i<n;i++)
		factorial[i]=factorial[i-1]*i;

	n--;
	k--;

	printf("%.0Lf\n", factorial[n]/(factorial[k]*factorial[n-k]));

	return 0;
}
728x90

문제

한국에서 나이는 총 3가지 종류가 있다.

  • 만 나이: 국제적인 표준 방법이다. 한국에서도 법에서는 만 나이만을 사용한다.
  • 세는 나이: 한국에서 보통 나이를 물어보면 세는 나이를 의미한다.
  • 연 나이: 법률에서 일괄적으로 사람을 구분하기 위해서 사용하는 나이이다.

만 나이는 생일을 기준으로 계산한다. 어떤 사람이 태어났을 때, 그 사람의 나이는 0세이고, 생일이 지날 때마다 1세가 증가한다. 예를 들어, 생일이 2003년 3월 5일인 사람은 2004년 3월 4일까지 0세이고, 2004년 3월 5일부터 2005년 3월 4일까지 1세이다.

세는 나이는 생년을 기준으로 계산한다. 어떤 사람이 태어났을 때, 그 사람의 나이는 1세이고, 연도가 바뀔 때마다 1세가 증가한다. 예를 들어, 생일이 2003년 3월 5일인 사람은 2003년 12월 31일까지 1세이고, 2004년 1월 1일부터 2004년 12월 31일까지 2세이다.

연 나이는 생년을 기준으로 계산하고, 현재 연도에서 생년을 뺀 값이다. 예를 들어, 생일이 2003년 3월 5일인 사람은 2003년 12월 31일까지 0세이고, 2004년 1월 1일부터 2004년 12월 31일까지 1세이다.

어떤 사람의 생년월일과 기준 날짜가 주어졌을 때, 기준 날짜를 기준으로 그 사람의 만 나이, 세는 나이, 연 나이를 모두 구하는 프로그램을 작성하시오.

입력

첫째 줄에 어떤 사람이 태어난 연도, 월, 일이 주어진다. 생년월일은 공백으로 구분되어져 있고, 항상 올바른 날짜만 주어진다.

둘째 줄에 기준 날짜가 주어진다. 기준 날짜도 공백으로 구분되어져 있으며, 올바른 날짜만 주어진다.

입력으로 주어지는 생년월일은 기준 날짜와 같거나 그 이전이다.

입력으로 주어지는 연도는 1900년보다 크거나 같고, 2100년보다 작거나 같다.

출력

첫째 줄에 만 나이, 둘째 줄에 세는 나이, 셋째 줄에 연 나이를 출력한다.

예제 입력 1

2003 3 5
2003 4 5

예제 출력 1

0
1
0

예제 입력 2

2003 3 5
2004 1 1

예제 출력 2

0
2
1

예제 입력 3

2005 1 1
2007 1 1

예제 출력 3

2
3
2

예제 입력 4

2005 12 31
2007 1 1

예제 출력 4

1
3
2

예제 입력 5

2006 1 1
2007 1 1

예제 출력 5

1
2
1

예제 입력 6

2005 1 2
2007 1 1

예제 출력 6

1
3
2

더보기

Solution

#include<stdio.h>

int main(void)
{
	int date[2][3];

	for(int i=0;i<2;i++)
		for(int j=0;j<3;j++)
			scanf("%d", &date[i][j]);

 	printf("%d\n", date[1][1]>date[0][1] || date[1][1]==date[0][1] && date[1][2]>=date[0][2]?date[1][0]-date[0][0]:date[1][0]-date[0][0]-1);
 	printf("%d\n", date[1][0]-date[0][0]+1);
 	printf("%d\n", date[1][0]-date[0][0]);

	return 0;
}
728x90

문제

“6 × 9 = 42” is not true for base 10, but is true for base 13. That is, 6(13) × 9(13) = 42(13) because 42(13) = 4 × 131 + 2 × 130 = 54(10).

You are to write a program which inputs three integers p, q, and r and determines the base B (2 ≤ B ≤ 16) for which p × q = r. If there are many candidates for B, output the smallest one. For example, let p = 11, q = 11, and r = 121. Then we have 11(3) × 11(3) = 121(3) because 11(3) = 1 × 31 + 1 × 30 = 4(10) and 121(3) = 1 × 32 + 2 × 31+ 1 × 30 = 16(10). For another base such as 10, we also have 11(10) × 11(10) = 121(10). In this case, your program should output 3 which is the smallest base. If there is no candidate for B, output 0.

입력

The input consists of T test cases. The number of test cases (T ) is given in the first line of the input file. Each test case consists of three integers p, q, and r in a line. All digits of p, q, and r are numeric digits and 1 ≤ p, q, r ≤ 1,000,000.

출력

Print exactly one line for each test case. The line should contain one integer which is the smallest base for which p × q = r. If there is no such base, your program should output 0.

예제 입력 1

3
6 9 42
11 11 121
2 2 2

예제 출력 1

13
3
0

더보기

Solution

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

int maxdigit(int p,int q,int r)
{
	int max=0;

	while(p>0)
	{
		max=p%10>max?p%10:max;
		p/=10;
	}
	while(q>0)
	{
		max=q%10>max?q%10:max;
		q/=10;
	}
	while(r>0)
	{
		max=r%10>max?r%10:max;
		r/=10;
	}

	return max;
}

int todecimal(int x,int n)
{
	int decimal=0;

	for(int i=0;x>0;i++)
	{
		decimal+=(x%10)*(int)pow((double)n,(double)i);
		x/=10;
	}

	return decimal;
}

int main(void)
{
	int T;

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		int p, q, r;
		bool solved=false;

		scanf("%d %d %d", &p, &q, &r);

		for(int n=maxdigit(p,q,r)+1;n<=16;n++)
			if(todecimal(p,n)*todecimal(q,n)==todecimal(r,n))
			{
				printf("%d\n", n);
				solved=true;
				break;
			}

		if(!solved)
			printf("0\n");
	}

	return 0;
}
728x90

문제

정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 4가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 합을 이루고 있는 수의 순서만 다른 것은 같은 것으로 친다.

  • 1+1+1+1
  • 2+1+1 (1+1+2, 1+2+1)
  • 2+2
  • 1+3 (3+1)

정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 10,000보다 작거나 같다.

출력

각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.

예제 입력 1

3
4
7
10

예제 출력 1

4
8
14

더보기

Solution

#include<stdio.h>

int onetwothree(int n,int three,int two,int count)
{
	if(two>0)
		return onetwothree(n,three,0,count+two);
	else if(three>0)
		return onetwothree(n,three-1,(n-3*(three-1))/2,count+1);
	else
		return count;
}

int main(void)
{
	int T;

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		int n;

		scanf("%d", &n);

		printf("%d\n", onetwothree(n,n/3,(n-3*(n/3))/2,1));
	}

	return 0;
}
728x90

+ Recent posts