문제

도현이는 Counter Terror Unit (CTU)에서 일하는 특수요원이다. 도현이는 모든 사건을 정확하게 24시간이 되는 순간 해결하는 것으로 유명하다. 도현이는 1시간 만에 범인을 잡을 수 있어도 잡지 않는다. 정확하게 24시간이 되는 순간이 아니면 잡지 않는 CTU 특수요원이다.

2008년 3월 3일 월요일, CTU는 새학기에 맞춰 핵폭탄을 날리겠다는 테러 정보를 입수했다. CTU에서는 특수요원 도현이에게 이 임무를 맡겼다. CTU의 프로그래머 준규는 이 사건의 배후가 김선영이란 것을 해킹을 통해 밝혀내었다.

도현이는 선영이를 임무를 시작한지 정확하게 24시간이 되는 순간에 잡으려고 한다.

만약 지금 시간이 13:52:30이고, 임무를 시작한 시간이 14:00:00 이라면 도현이에게 남은시간은 00:07:30 이다.

모든 시간은 00:00:00 ~ 23:59:59로 표현할 수 있다. 입력과 출력에 주어지는 모든 시간은 XX:XX:XX 형태이며, 숫자가 2자리가 아닐 경우에는 0으로 채운다.

도현이가 임무를 시작한 시간과, 현재 시간이 주어졌을 때, 도현이에게 남은 시간을 구하는 프로그램을 작성하시오.

입력

첫째 줄에는 현재 시간이, 둘째 줄에는 도현이가 임무를 시작한 시간이 주어진다. 임무를 시작한 시간과 현재 시간이 같은 경우는 주어지지 않는다.

출력

첫째 줄에 도현이가 임무를 수행하는데 남은 시간을 문제에서 주어지는 시간의 형태 (XX:XX:XX)에 맞춰 출력한다.

예제 입력 1

13:52:30
14:00:00

예제 출력 1

00:07:30

더보기

Solution

#include<stdio.h>

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

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

	for(int i=0;i<3;i++)
		time[1][i]-=time[0][i];

	for(int i=2;i>0;i--)
		while(time[1][i]<0)
		{
			time[1][i]+=60;
			time[1][i-1]--;
		}
	while(time[1][0]<0)
		time[1][0]+=24;

	printf("%02d:%02d:%02d\n", time[1][0], time[1][1], time[1][2]);

	return 0;
}
728x90

문제

홍익대학교는 1946년에 개교하였다.

특정 년도가 주어졌을 때, 그 해가 개교 몇 주년인지 출력하라.

단, 홍익대학교는 없어지지 않는다고 가정한다.

문제는 C, C++, JAVA 또는 Python3을 이용하여 해결한다.

  1. C
    1. 입력
      • scanf 사용
      • 정수 %d, 실수 %f, 문자열 %s 사용
      • scanf("%d", &var);
    2. 출력
      • 정수 %d, 실수 %f, 문자열 %s 사용
      • 예) printf("%d", var);
    3. 필수 라이브러리 stdio.h
  2. C++
    1. 입력
      • cin 사용
      • 예) cin >> var;
    2. 출력
      • cout 사용
      • 예) cout << var;
    3. 필수 라이브러리 iostream
    4. 권장사항
      • using namespace std;
      • ios::sync_with_stdio(false);
      • cin.tie(NULL);
  3. Java
    1. 입력
      • Scanner 사용
      • Scanner sc = new Scanner(System.in);
        정수: sc.nextInt(); 실수: sc.nextDouble(); 문자열: sc.nextLine(); 또는 sc.next();
    2. 출력
      • System.out.println(var);
    3. 필수 라이브러리 java.util.Scanner

입력

입력으로 첫 줄에 특정 년도를 알리는 정수 N이 주어진다. 정수 N은 1,946 부터 1,000,000 사이의 값이다. (1,946 ≤  N ≤  1,000,000)

출력

출력으로 홍익대학교의 개교 주년을 나타내는 정수를 출력한다.

예제 입력 1

2018

예제 출력 1

72

더보기

Solution

#include<stdio.h>

int main(void)
{
	int Hongik;

	scanf("%d", &Hongik);

	printf("%d\n", Hongik-1946);

	return 0;
}
728x90

문제

성민이는 이번 학기에 미적분학 과목을 수강하고 있다. 다항함수의 미분 단원 과제를 하던 도중 미분을 하기가 귀찮아진 성민이는 미분하려는 함수 f(x)가 주어지면, 미분 된 함수 f’(x)를 자동으로 구해주는 프로그램을 만들어서 계산을 줄일 생각을 하였다. 우리도 성민이가 원하는 프로그램을 한번 같이 만들어보도록 하자.

입력

첫째 줄에는 항의 개수 N(1 ≤ N ≤ 100)이 주어진다.

둘째 줄부터 N개 줄에 걸쳐서 항의 계수 C(-100 ≤ C ≤ 100, C ≠ 0)와 항의 차수 K(0 ≤ K ≤ 1000)가 항의 차수가 큰 순서대로 주어진다. 항의 차수가 같은 항은 2개 이상 존재하지 않는다.

출력

f’(1)의 값을 첫째 줄에 출력한다.

예제 입력 1

3
3 3
2 2
1 1

예제 출력 1

14

힌트

f(x) = 3x^3 + 2x^2 + x를 미분하면, f’(x) = 9x^2 + 4x + 1이 된다.

그래서 f’(1) = 9*1*1 + 4*1 + 1 = 14가 된다.


더보기

Solution

#include<stdio.h>

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

	scanf("%d", &N);

	for(int n=0;n<N;n++)
	{
		int C, K;

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

		prime1+=C*K;
	}

	printf("%d\n", prime1);

	return 0;
}
728x90

문제

당신은 길을 가다가 이상한 쪽지를 발견했다. 그 쪽지에는 암호가 적혀 있었는데, 똑똑한 당신은 암호가 뒤집으면 해독된다는 것을 발견했다.

이 암호를 해독하는 프로그램을 작성하시오.

입력

한 줄에 하나의 암호가 주어진다. 암호의 길이는 500을 넘지 않는다.

마지막 줄에는 "END"가 주어진다. (END는 해독하지 않는다.)

출력

각 암호가 해독된 것을 한 줄에 하나씩 출력한다.

예제 입력 1

!edoc doog a tahW
noitacitsufbo
erafraw enirambus detcirtsernu yraurbeF fo tsrif eht no nigeb ot dnetni eW
lla sees rodroM fo drol eht ,ssertrof sih nihtiw delaecnoC
END

예제 출력 1

What a good code!
obfustication
We intend to begin on the first of February unrestricted submarine warfare
Concealed within his fortress, the lord of Mordor sees all

더보기

Solution

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

int main(void)
{
	while(1)
	{
		char note[501]={'\0', };

		fgets(note,sizeof(note),stdin);
		note[strlen(note)-1]='\0';

		if(strcmp(note,"END")==0)
			break;

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

	return 0;
}
728x90

문제

이교수님은 UCPC의 교수이다. 그의 강좌는 선다형 방식으로 이루어지는 기말고사로 유명하다. 시험에는 총 10문제가 출제되며 학생들은 5개의 보기 중 가장 답에 가까운 것을 선택해야한다. 이것이 UCPC의 학생들이 그의 강좌를 좋아하는 이유이다. 하지만, 보통 문제들이 까다로워서 학생들이 시험에서 만점을 받는 것은 거의 어렵다. 

이번 학기에는 놀라운 일이 일어났다; 그의 한 강좌에서, 시험 문제들의 정답이 특별한 패턴을 형성하는 것이다! j번째 문제의 정답은 ((j-1) mod 5) +1 번이며, 여기서 mod는 나머지 연산을 의미한다. 예를 들어 첫 번째 문제의 정답은 ((1-1) mod 5) +1 = 1로 1번이며, 여덟번째 문제의 정답은 ((8-1) mod 5) +1 = 3 으로 3번이 된다. 문제의 번호는 1번부터 10번이며 문제의 다섯가지 보기는 1번부터 5번까지임을 유의해라.

하지만 UCPC의 학생들의 실력은 이 패턴을 시험 시간동안 깨달았을 정도로 우수하다. 상대적으로 쉬운 앞부분의 몇 문제를 푼 후, 많은 수의 학생들이 위의 공식을 발견했고 나머지 어려운 문제들을 실제로 풀지 않고 답할 수 있었다. 이것은 명확한 부정행위이기 때문에, 이 교수님은 만점을 받은 학생들을 대상으로 새로운 시험문제로 재시험을 보기로 결정했다. (물론, 새로운 시험 문제의 답들은 아무런 패턴도 형성하지 않는다.)

N명의 학생들의 답안지가 주어졌을 때, 재시험을 보아야하는 학생의 목록을 구하는 프로그램을 작성해라.

입력

첫 번째 줄은 시험을 본 학생수를 나타내는 정수 N이 주어진다.(1 ≤ N ≤ 100)

N번째 줄까지는 1에서 5사이에 해당하는 정수 열개가 주어진다. i번째 줄의 j번째 수는 i번째 학생이 고른 j번째 문제의 답을 의미한다. (1 ≤ i ≤ N, 1 ≤ j ≤ 10)

한줄에 입력되는 수들은 공백으로 구분된다.

출력

재시험을 보아야하는 학생의 목록을 오름차순으로 출력한다.

각 학생의 번호는 한줄에 하나씩 출력한다.

예제 입력 1

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

예제 출력 1

2
4
5

더보기

Solution

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

bool fullcheck(int paper[])
{
	for(int i=0;i<10;i++)
		if(paper[i]!=(i%5)+1)
			return false;
	return true;
}

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

	scanf("%d", &N);

	for(int i=1;i<=N;i++)
	{
		int paper[10];

		for(int j=0;j<10;j++)
			scanf("%d", &paper[j]);

		if(fullcheck(paper))
			printf("%d\n", i);
	}

	return 0;
}
728x90

문제

창영이는 이번학기에 어떤 교양수업을 듣고 있다. 그런데, 그 교수님은 매우 지각을 자주 하시고 게다가 수업에 지각을 하였을 경우 수업을 일찍 마쳐 주기까지 하는 것을 발견하였다.

창영이는 교수님의 지각시간 0이상의 정수 t와 수업을 일찍 마쳐주는 시간 s 사이에 다음과 같은 관계가 있음을 알았다.

s = t^2

문득 창영이는 수업시간 d가 주어졌을 때, 교수님이 얼마나 지각을 할 수 있는지 궁금해졌고, 여러분은 창영이를 도와서 교수님이 지각할 수 있는 최대의 시간을 알아보자. 물론, 교수님이 도착하자마자 수업을 일찍 마쳐서 수업이 끝나는 것도 가능하다. 예를 들어, 수업시간이 6분인 경우, 교수님이 2분 지각을 하면, 4분간 수업을 일찍 마치게 되고, 2+4=6이기 때문에 바로 수업을 끝낼 수 있다. 또 다른 예로, 수업시간이 7분인 경우 교수님이 2분 지각을 하면, 수업을 4분 일찍 마쳐줄 수 있고, 2+4≤7 이므로 가능한 경우가 되고, 교수님이 3분 지각을 하게 되면, 수업을 9분 일찍 마쳐야 되고, 3+9>7 이므로, 교수님이 3분 지각을 하는 것은 불가능하다. 따라서, 교수님은 수업시간이 7분인 경우 교수님은 최대 2분간 지각을 할 수 있다.

입력

창영이가 궁금한 경우의 수 T(1 ≤ T ≤ 100)가 첫 번째 줄에 주어지고, 이어서 T 개의 줄에 수업시간 d(1 ≤ d ≤ 10,000, d는 정수)가 차례대로 주어진다.

출력

수업시간에 따른 교수님이 지각할 수 있는 최대 시간 t를 정수로 구해서 출력한다.

예제 입력 1

5
1
2
5
6
7

예제 출력 1

0
1
1
2
2

더보기

Solution

#include<stdio.h>

int main(void)
{
	int T;

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		int d, s=0;

		scanf("%d", &d);

		while(s+s*s<=d)
			s++;

		printf("%d\n", s-1);
	}

	return 0;
}
728x90

문제

어떤 수 X가 주어졌을 때, X의 모든 자리수가 역순이 된 수를 얻을 수 있다. Rev(X)를 X의 모든 자리수를 역순으로 만드는 함수라고 하자. 예를 들어, X=123일 때, Rev(X) = 321이다. 그리고, X=100일 때, Rev(X) = 1이다.

두 양의 정수 X와 Y가 주어졌을 때, Rev(Rev(X) + Rev(Y))를 구하는 프로그램을 작성하시오

입력

첫째 줄에 수 X와 Y가 주어진다. X와 Y는 1,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 문제의 정답을 출력한다.

예제 입력 1

123 100

예제 출력 1

223

더보기

Solution

#include<stdio.h>

int Rev(int X)
{
	int reversed=0;

	while(X>0)
	{
		reversed*=10;
		reversed+=X%10;
		X/=10;
	}

	return reversed;
}

int main(void)
{
	int X, Y;

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

	X=Rev(X);
	Y=Rev(Y);

	printf("%d\n", Rev(X+Y));

	return 0;
}
728x90

문제

재원이는 한 도시의 시장이 되었다. 이 도시에는 도시를 동쪽과 서쪽으로 나누는 큰 강이 흐르고 있다. 하지만 재원이는 다리가 없어서 시민들이 강을 건너는데 큰 불편을 겪고 있음을 알고 다리를 짓기로 결심하였다. 강 주변에서 다리를 짓기에 적합한 곳을 사이트라고 한다. 재원이는 강 주변을 면밀히 조사해 본 결과 강의 서쪽에는 N개의 사이트가 있고 동쪽에는 M개의 사이트가 있다는 것을 알았다. (N ≤ M)

재원이는 서쪽의 사이트와 동쪽의 사이트를 다리로 연결하려고 한다. (이때 한 사이트에는 최대 한 개의 다리만 연결될 수 있다.) 재원이는 다리를 최대한 많이 지으려고 하기 때문에 서쪽의 사이트 개수만큼 (N개) 다리를 지으려고 한다. 다리끼리는 서로 겹쳐질 수 없다고 할 때 다리를 지을 수 있는 경우의 수를 구하는 프로그램을 작성하라.

입력

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 강의 서쪽과 동쪽에 있는 사이트의 개수 정수 N, M (0 < N ≤ M < 30)이 주어진다.

출력

각 테스트 케이스에 대해 주어진 조건하에 다리를 지을 수 있는 경우의 수를 출력한다.

예제 입력 1

3
2 2
1 5
13 29

예제 출력 1

1
5
67863915

더보기

Solution

#include<stdio.h>

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

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

	scanf("%d", &T);

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

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

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

	return 0;
}
728x90

+ Recent posts