문제

접시는 아래의 그림과 같이 중심이 같은 두 원이 겹쳐져 있는 형태이다.

여기에서 작은 원의 접선이 큰 원과 만나는 두 점 사이의 거리를 T, 작은 원의 반지름을 b, 큰 원의 반지름을 a라고 한다. T의 값이 주어지면, a^2-b^2의 값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 양의 정수 T의 값이 주어진다. 단, T의 값은 10,000 이하이다.

출력

a^2-b^2의 값을 소수점 아래의 첫째 자리에서 반올림하여 정수로 출력한다. 예를 들어, a^2-b^2의 값이 1.91이면 2를 출력한다.

예제 입력 1

17

예제 출력 1

72

더보기

Solution

#include<stdio.h>

int main(void)
{
	int T;

	scanf("%d", &T);
	printf("%d\n", T*T/4);

	return 0;
}
728x90

문제

정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.

  1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
  2. X가 2로 나누어 떨어지면, 2로 나눈다.
  3. 1을 뺀다.

정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.

입력

첫째 줄에 1보다 크거나 같고, 10^6보다 작거나 같은 정수 N이 주어진다.

출력

첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.

예제 입력 1

2

예제 출력 1

1

예제 입력 2

10

예제 출력 2

3

더보기

Solution

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

int min3(int X,int Y,int Z)
{
	return X<=Y&&X<=Z?X:Y<=X&&Y<=Z?Y:Z;
}

int min2(int X,int Y)
{
	return X<Y?X:Y;
}

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

	scanf("%d", &N);
	X=(int *)calloc(N+1,sizeof(int));

	for(int i=2;i<=N;i++)
		if(i%6==0)
			X[i]=min3(X[i-1],X[i/2],X[i/3])+1;
		else if(i%2==0)
			X[i]=min2(X[i-1],X[i/2])+1;
		else if(i%3==0)
			X[i]=min2(X[i-1],X[i/3])+1;
		else
			X[i]=X[i-1]+1;

	printf("%d\n", X[N]);
	free(X);
	return 0;
}
728x90

문제

이번 ACM-ICPC 대회에 참가한 모든 사람들은 선물을 하나씩 준비했다.

대회가 끝나고 난 후에 각자 선물을 전달하려고 할 때, 선물을 나누는 경우의 수를 구하는 프로그램을 작성하시오.

모든 사람은 선물은 하나씩 받으며, 자기의 선물을 자기가 받는 경우는 없다.

입력

첫째 줄에 ACM-ICPC 대회에 참가한 학생의 수 N(1≤N≤1,000,000)이 주어진다.

출력

경우의 수를 1,000,000,000으로 나눈 나머지를 첫째 줄에 출력한다.

예제 입력 1

5

예제 출력 1

44

더보기

Solution

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

int main(void)
{
	int N;
	long int *count=NULL;

	scanf("%d", &N);
	count=(long int *)malloc((N+1)*sizeof(long int));

	count[0]=1;
	count[1]=0;
	for(int i=2;i<=N;i++)
		count[i]=((i-1)*(count[i-1]+count[i-2]))%1000000000;

	printf("%ld\n", count[N]);
	free(count);
	return 0;
}
728x90

문제

RUNIST 대학교에서는 매 학기마다 재미있는 기숙사 배정을 한다.

RUNIST 대학교에는 N명의 학생이 있고 N개의 기숙사가 있다. 모든 N명의 학생들은 봄학기에 기숙사를 한 명 당 하나씩 배정을 받았고, 모두 각각 다 다른 기숙사에 배정이 되었다.

이제 가을학기가 되어 학생복지팀에서는 기숙사를 다시 배정하려고 한다. 모든 학생들은 본인이 살았던 봄학기 기숙사에서 가을 학기에 다른 기숙사로 배정되면 이사를 해야하므로 기숙사 재배정을 신청하였다. (기숙사 재배정이 된다면 기숙사를 그대로 쓰게 된다.)

이렇게 모든 학생들은 기숙사 재배정을 신청했지만, 학생복지팀에서는 어떤 학생에게도 기숙사 재배정을 해주지 않으려고 한다.

봄학기때 기숙사를 이미 배정받은 상태에서, 가을학기 기숙사에 아무도 재배정이 되지 않는 경우의 수를 구해보자.

입력

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

각 케이스의 첫 번째 줄에 학생 명수(기숙사의 개수) N (1 ≤ N ≤ 20) 이 주어진다. 

출력

각 테스트 케이스 별로 아무도 재배정이 되지 않는 경우의 수를 출력한다.

예제 입력 1

2
3
4

예제 출력 1

2
9

더보기

Solution

#include<stdio.h>

int main(void)
{
	long int D[21]={1,0,1,2,};
	int T, N;

	for(int n=4;n<21;n++)
		D[n]=(n-1)*(D[n-1]+D[n-2]);

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		scanf("%d", &N);
		printf("%ld\n", D[N]);
	}

	return 0;
}
728x90

문제

돌 게임은 두 명이서 즐기는 재밌는 게임이다.

탁자 위에 돌 N개가 있다. 상근이와 창영이는 턴을 번갈아가면서 돌을 가져가며, 돌은 1개, 3개 또는 4개 가져갈 수 있다. 마지막 돌을 가져가는 사람이 게임을 이기게 된다.

두 사람이 완벽하게 게임을 했을 때, 이기는 사람을 구하는 프로그램을 작성하시오. 게임은 상근이가 먼저 시작한다.

입력

첫째 줄에 N이 주어진다. (1 ≤ N ≤ 1000)

출력

상근이가 게임을 이기면 SK를, 창영이가 게임을 이기면 CY을 출력한다.

예제 입력 1

6

예제 출력 1

SK

더보기

Solution

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

int main(void)
{
	bool stone[1001]={false,true,false,true,true,true,true,false, };
	int N;

	scanf("%d", &N);

	for(int n=6;n<=N;n++)
		stone[n]=!(stone[n-1]&&stone[n-3]&&stone[n-4]);

	printf("%s\n", stone[N]?"SK":"CY");
	return 0;
}
728x90

문제

꿍은 수능에 응시하고 있었는데 어느덧 4교시 탐구영역 시간이 되었다. 그런데 탐구영역은 다른 영역과 다르게 자기가 응시할 과목만 고르고 응시하지 않는 과목은 바닥에 버리도록 되어있다. 꿍이 응시하지 않는 과목을 골라 뽑아내던 중 문득 궁금한게 생겼다. 만약 탐구영역 시험지가 아래와 같이 전체 12쪽으로 되어 있었다고 하자. 

그렇다면 1쪽과 12쪽은 한 면에, 2쪽과 11쪽이 한면에, ... 6쪽과 7쪽이 한면에 인쇄되어 있고 1,2,11,12쪽이 한 장, 3,4,9,10쪽이 한 장, 5,6,7,8이 한 장 이다. 그래서 만약 꿍이 2쪽이 인쇄된 종이 한 장을 바닥에 버렸을 때, 그 종이에 인쇄된 나머지 쪽, 즉 사라진 페이지들은 1,11,12쪽이다.

꿍이 탐구영역을 응시할 동안 여러분들은 한 쪽의 페이지만으로 사라진 나머지의 페이지들을 찾아주어라.

입력

각 테스트 케이스에 대해 두가지 정수 N,P가 주어진다. 4의 배수인 N(4 ≤ N ≤ 1000)은 탐구영역의 전체 페이지 수이며, P(1 ≤ P  N)는 선택된 한 페이지다. 입력의 마지막은 하나의 0만 주어진다.

출력

각 테스트 케이스에 대해 사라진 페이지들을 오름차순으로 출력한다.

예제 입력 1

12 2
12 9
8 3
0

예제 출력 1

1 11 12
3 4 10
4 5 6

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N, P;

	scanf("%d", &N);
	while(N!=0)
	{
		scanf("%d", &P);
		if(2*P<=N)
			if(P%2==1)
				printf("%d %d %d\n", P+1, N-P, N+1-P);
			else
				printf("%d %d %d\n", P-1, N+1-P, N+2-P);
		else
			if(P%2==0)
				printf("%d %d %d\n", N+1-P, N+2-P, P-1);
			else
				printf("%d %d %d\n", N-P, N+1-P, P+1);
		scanf("%d", &N);
	}

	return 0;
}
728x90

문제

매일 매일 일곱 난쟁이는 광산으로 일을 하러 간다. 난쟁이가 일을 하는 동안 백설공주는 그들을 위해 저녁 식사를 준비한다. 백설공주는 의자 일곱개, 접시 일곱개, 나이프 일곱개를 준비한다.

어느 날 광산에서 아홉 난쟁이가 돌아왔다. (왜 그리고 어떻게 아홉 난쟁이가 돌아왔는지는 아무도 모른다) 아홉 난쟁이는 각각 자신이 백설공주의 일곱 난쟁이라고 우기고 있다.

백설공주는 이런 일이 생길 것을 대비해서, 난쟁이가 쓰고 다니는 모자에 100보다 작은 양의 정수를 적어 놓았다. 사실 백설 공주는 공주가 되기 전에 매우 유명한 수학자였다. 따라서, 일곱 난쟁이의 모자에 쓰여 있는 숫자의 합이 100이 되도록 적어 놓았다.

아홉 난쟁이의 모자에 쓰여 있는 수가 주어졌을 때, 일곱 난쟁이를 찾는 프로그램을 작성하시오. (아홉 개의 수 중 합이 100이 되는 일곱 개의 수를 찾으시오)

입력

총 아홉개 줄에 1보다 크거나 같고 99보다 작거나 같은 자연수가 주어진다. 모든 숫자는 서로 다르다. 또, 항상 답이 유일한 경우만 입력으로 주어진다.

출력

일곱 난쟁이가 쓴 모자에 쓰여 있는 수를 한 줄에 하나씩 출력한다.

예제 입력 1

7
8
10
13
15
19
20
23
25

예제 출력 1

7
8
10
13
19
20
23

예제 입력 2

8
6
5
1
37
30
28
22
36

예제 출력 2

8
6
5
1
30
28
22

더보기

Solution

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

int main(void)
{
	int dwarf[9], sum=0;
	bool solved=false;

	for(int i=0;i<9;i++)
	{
		scanf("%d", &dwarf[i]);
		sum+=dwarf[i];
	}

	for(int i=0;i<8;i++)
	{
		for(int j=i+1;j<9;j++)
			if(sum-dwarf[i]-dwarf[j]==100)
			{
				for(int k=0;k<9;k++)
					if(k!=i && k!=j)
						printf("%d\n", dwarf[k]);
				solved=true;
			break;
			}
		if(solved)
			break;
	}

	return 0;
}
더보기

Solution

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb=new StringBuilder();

		int[] dwarf=new int[9];
		int sum=0;
		
		for(int i=0;i<9;i++) {
			dwarf[i]=Integer.parseInt(br.readLine());
			sum+=dwarf[i];
		}
		
		for(int i=0;i<8;i++)
			for(int j=i+1;j<9;j++)
				if(sum-dwarf[i]-dwarf[j]==100) {
					for(int k=0;k<9;k++)
						if(k!=i && k!=j)
							sb.append(dwarf[k]+"\n");
					System.out.print(sb.toString());
					return;
				}
	}
}

 

728x90

문제

엑셀의 첫 번째 열은 A이고, 두 번째 열은 B이고, 26번째 열은 Z이다. 26번째 열 다음 열부터는 2글자를 이용한다. 

예를 들어, 27번째 열은 AA이고, 28번째 열은 AB, 52번째 열은 AZ이다. 그 다음 53번째 열은 BA이며, 이와 같이 계속 열의 이름을 붙인다.

ZZ열 다음 열은 AAA가 되고, 그 다음은 AAB가 된다.

엑셀에서 행은 그냥 행 번호를 사용하면 된다.

엑셀 스프레드시트에서 각 칸은 위에서 설명한 열과 행을 합쳐서 이름을 만들 수 있다. 가장 왼쪽 위에 있는 칸은 A1이 되고, 55열 23행에 있는 칸은 BC23이 된다.

열과 행이 주어졌을 때, 그 칸의 엑셀 스프레드시트 상에서 이름을 출력하는 프로그램을 작성하시오.

입력

입력은 여러 줄이며, RnCm형태이다. n은 행 번호 (1<=n<=300000000), m은 열 번호 (1<=m<=300000000) 이다. 입력의 마지막은 n과 m이 모두 0이며, 이때는 출력하지 않고 프로그램을 종료하면 된다.

출력

각 입력을 순서대로 한 줄에 하나씩 엑셀 스프레드시트 상에서의 이름을 출력하면 된다.

예제 입력 1

R1C1
R3C1
R1C3
R299999999C26
R52C52
R53C17576
R53C17602
R0C0

예제 출력 1

A1
A3
C1
Z299999999
AZ52
YYZ53
YZZ53

더보기

Solution

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

int main(void)
{
	int n, m;

	scanf("R%dC%d", &n, &m);

	while(n!=0 || m!=0)
	{
		char C[7]={'\0', };

		for(int i=0;m>0;i++)
		{
			m--;
			C[i]='A'+m%26;
			m/=26;
		}

		for(int i=strlen(C)-1;i>=0;i--)
			printf("%c", C[i]);
		printf("%d\n", n);

		getchar();
		scanf("R%dC%d", &n, &m);
	}

	return 0;
}
728x90

+ Recent posts