문제

선영이의 집에는 콘센트를 꽂을 수 있는 플러그가 하나밖에 없다. 선영이는 많은 컴퓨터를 가지고 있는데, 컴퓨터의 전원 문제는 어떻게 해결하는 것일까?

하나의 플러그가 있고, N개의 멀티탭이 있다. 각 멀티탭은 몇 개의 플러그로 이루어져 있다고 한다. 최대 몇 대의 컴퓨터를 전원에 연결할 수 있을까?

입력

첫째 줄에 멀티탭의 개수 N이 주어진다. (1<=N<=500,000) 이어서 둘째 줄부터 N개의 줄에 걸쳐 각 멀티탭이 몇 개의 플러그를 꽂을 수 있도록 되어 있는지를 나타내는 자연수가 주어진다. 이 자연수는 1,000을 넘지 않는다.

출력

첫째 줄에 최대로 전원에 연결될 수 있는 컴퓨터의 수를 출력한다.

예제 입력 1

3
1
1
1

예제 출력 1

1

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N, sum=1, plug;

	scanf("%d", &N);

	for(int n=0;n<N;n++)
	{
		scanf("%d", &plug);
		sum+=plug-1;
	}

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

문제

오늘은 NAVER D2 캠퍼스에서 CTP 스터디 하는날!!! 스터디 장소가 인하대학교 강의실에서 NAVER D2 캠퍼스로 바뀌었기 때문에 멀티탭 부장 준호는 스터디 전에 미리 멀티탭을 셋팅 해야 한다. CTP는 모든 사람이 사용할만큼 충분한 멀티탭을 가지고 있다. 종류는 3구부터 8구까지 다양하게 있다. 모든 사람들은 노트북만 가져오기 때문에 멀티탭 1구를 무조건 사용한다. 1구를 초과해선 안 된다.

CTP에는 멀티탭에 2개이상 연속으로 코드를 꽂으면 안되는 특별한 규칙이 있다. 준호는 미리 계산을 해서 모두가 코드를 꽂을 수 있게 멀티탭을 K개 챙겨 갔다. 

하지만 준호는 수학과에서 수학을 못해 전과했기 때문에 가끔 멀티탭을 적게 가지고 올 때가 있다. 수학을 더 잘하는 여러분이 멀티탭을 충분히 챙겨왔는지 준호에게 알려주자

최초 전기 공급원(벽면 콘센트)는 총 K개이고, 각각의 멀티탭은 개별적으로 전기를 공급받는다. 즉, 멀티탭을 다른 멀티탭에 이어서 연결하는 경우는 없다.

입력

입력의 첫째 줄에 스터디에 온 학생의 수 N(1 ≤ N ≤ 100)명 멀티탭의 수 K(1 ≤ K ≤ 100)가 주어진다. 이후 두 번째 줄에 각 멀티탭 구의 수 A[i](3 ≤ A[i] ≤ 8) 가 주어진다. 

출력

모든 사람이 멀티탭에 코드를 꽂을 수 있는경우 “YES” 아니라면 “NO”를 출력한다.

예제 입력 1

3 5
3 4 5 6 7

예제 출력 1

YES

예제 입력 2

6 2
3 4

예제 출력 2

NO

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N, K, A, sum=0;

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

	for(int i=0;i<K;i++)
	{
		scanf("%d", &A);
		sum+=A%2==0?A/2:A/2+1;
	}

	printf("%s\n", N<=sum?"YES":"NO");
	return 0;
}
728x90

문제

스타워즈에 등장하는 로봇인 C3PO는 요즘 콜센터에 근무하고 있다. 콜센터에 앉아있는 C3PO를 그리는 프로그램을 작성하시오.

출력

예제 출력처럼 콜센터에 앉아있는 C3PO를 출력한다. 마지막 세 줄의 두 '|' 사이에는 공백이 10개 있다.

예제 입력 1

 

예제 출력 1

     /~\
    ( oo|
    _\=/_
   /  _  \
  //|/.\|\\
 ||  \ /  ||
============
|          |
|          |
|          |

더보기

Solution

#include<stdio.h>

int main(void)
{
	printf("     /~\\\n    ( oo|\n    _\\=/_\n   /  _  \\\n  //|/.\\|\\\\\n ||  \\ /  ||\n============\n|          |\n|          |\n|          |\n");
	return 0;
}
728x90

문제

마이크로소프트 로고를 예제 출력처럼 출력하는 프로그램을 작성하시오.

출력

마이크로소프트 로고를 예제 출력처럼 출력한다.

예제 입력 1

 

예제 출력 1

       _.-;;-._
'-..-'|   ||   |
'-..-'|_.-;;-._|
'-..-'|   ||   |
'-..-'|_.-''-._|

더보기

Solution

#include<stdio.h>

int main(void)
{
	printf("       _.-;;-._\n'-..-'|   ||   |\n'-..-'|_.-;;-._|\n'-..-'|   ||   |\n'-..-'|_.-''-._|\n");
	return 0;
}
728x90

문제

Welcome을 예제 출력처럼 출력하는 프로그램을 작성하시오.

출력

Welcome을 아래 예제 출력처럼 출력한다.

예제 입력 1

 

예제 출력 1

.  .   .
|  | _ | _. _ ._ _  _
|/\|(/.|(_.(_)[ | )(/.

더보기

Solution

#include<stdio.h>

int main(void)
{
	printf(".  .   .\n|  | _ | _. _ ._ _  _\n|/\\|(/.|(_.(_)[ | )(/.\n");
	return 0;
}
728x90

문제

종이접기와 수학을 좋아하는 주성이는 종이접기와 수학을 한꺼번에 할 수 있는 놀이를 찾아냈다. 바로 N×N 크기를 가지는 색종이의 각 칸에 수를 적어놓고, 색종이를 반으로 접을 때마다 겹치는 부분의 수들을 더하는 것이다. 그리고 이 작업을 색종이를 더는 접을 수 없을 때까지 반복했을 때, 가장 마지막에 남는 수를 구하는 놀이이다.

아래의 예시는 위에서 설명한 놀이의 과정을 2×2 크기의 색종이를 사용하여 상세하게 나타낸 그림이다.

  • 색종이를 왼쪽에서 오른쪽으로 정확히 반을 접는다.
  • 겹치는 두 칸에 있는 수를 서로 더한다. 위 그림에서는 (1, 1)과 (1, 2)의 두 칸이 겹치고, (2, 1)과 (2, 2)의 두 칸도 겹치는 부분이다.
  • 더한 값을 색종이 위에 다시 적는다.

  • 색종이를 아래쪽에서 위쪽으로 정확히 반을 접는다.
  • 겹치는 두 칸에 있는 수를 서로 더한다. 위 그림에서는 (1, 1)과 (2, 1)의 두 칸이 겹치는 부분이다.
  • 더한 값을 색종이 위에 다시 적는다.

색종이를 반으로 접으면서 두꺼워지는 것을 고려하지 않고, 색종이를 더는 접을 수 없을 때까지 위 과정을 반복했을 때 가장 마지막에 남는 수를 구하여라.

입력

첫 번째 줄에는 색종이의 가로, 세로 길이를 의미하는 정수 N (N = 2^m, 1 ≤ m ≤ 10)이 주어진다.

두 번째 줄부터 마지막 줄까지는 N×N 크기의 색종이 정보가 주어지며, 색종이의 각 칸에는 정수 K (1 ≤ K ≤ 100,000)가 주어진다.

출력

색종이를 반으로 접으면서 겹치는 부분의 수들을 더하는 과정을 반복했을 때, 가장 마지막에 남는 수를 출력한다.

예제 입력 1

4
2 6 5 4
1 5 7 6
9 8 8 7
1 4 7 8

예제 출력 1

88

더보기

Solution

#include<stdio.h>

int main(void)
{
	long int sum=0, N;
	int K;

	scanf("%ld", &N);

	for(long int n=0;n<N*N;n++)
	{
		scanf("%d", &K);
		sum+=K;
	}

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

문제

다섯 개의 자연수가 있다. 이 수의 적어도 대부분의 배수는 위의 수 중 적어도 세 개로 나누어 지는 가장 작은 자연수이다.

서로 다른 다섯 개의 자연수가 주어질 때, 적어도 대부분의 배수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 다섯 개의 자연수가 주어진다. 100보다 작거나 같은 자연수이고, 서로 다른 수이다.

출력

첫째 줄에 적어도 대부분의 배수를 출력한다.

예제 입력 1

30 42 70 35 90

예제 출력 1

210

더보기

Solution

#include<stdio.h>

int main(void)
{
	int number[5];

	for(int n=0;n<5;n++)
		scanf("%d", &number[n]);

	for(int mul=4;;mul++)
	{
		int count=0;

		for(int n=0;n<5;n++)
			count+=mul%number[n]==0;

		if(count>2)
		{
			printf("%d\n", mul);
			break;
		}
	}

	return 0;
}
728x90

문제

“무한히 넓은 저 우주에 인류만이 홀로 존재한다면, 그건 정말 슬픈 일이 아닐까요”

푸에르토리코 아레시보에 위치한 아레시보 전파망원경(Arecibo radio telescope)은 수십 년째 존재하지 않을 지도 모르는 외계 문명으로부터의 전파를 수신하기 위해 밤하늘을 바라보고 있다.

이 망원경이 수집한 전파 속에서 자연적으로 발생하기 힘든 패턴들을 찾아내어, 그것을 증거로 외계 문명의 존재 여부를 가리려는 노력은 줄곧 이어져왔지만 아직까지도 그러한 패턴은 발견되지 않았다. 한국 천문학계의 자존심 김동혁 박사는 국내 기술로 이러한 탐사를 진행하기 위하여 다음의 전파 표기를 표준으로 삼았다.

전파의 기본 단위는 { 0 , 1 } 두 가지로 구성되어있으며, x+ (  ) 는 임의의 개수(최소 1개) x의 반복으로 이루어진 전파의 집합을 나타낸다.

(xyx)+ (  ) 는 괄호 내의 xyx의 반복으로 이루어진 전파의 집합을 뜻한다. 아래는 이해를 돕기 위한 예제이다.

  • 1+ = { 1, 11, 111, 1111, 11111, … }
  • 10+ = { 10, 100, 1000, 10000, 100000, … }
  • (01)+ = { 01, 0101, 010101, 01010101, 0101010101, … }
  • (1001)+ = { 1001, 10011001, 100110011001, … }
  • 10+11 = { 1011, 10011, 100011, 1000011, 10000011, … }
  • (10+1)+ = { 101, 1001, 10001, 1011001, 1001101, 100011011000001, … }

반복을 의미하는 + 외에도 or 를 의미하는 | 기호가 있다. { x | y } 는 x 혹은 y 를 의미하는 것으로, { 0+ | 1+ } 는 { 0 , 1 , 00 , 11 , 000 , 111 , … } 의 집합을 의미한다. 아래는 두 기호를 복합적으로 사용한 예이다.

  • (100 | 11)+ = { 100 , 11 , 10011 , 11100 , 1110011100 , 100111111100100, … }

최근 김동혁 박사는 아레시보 전파망원경에서 star Vega(직녀성) 으로부터 수신한 전파 기록의 일부를 조사하여 그 전파들의 패턴을 분석하여 아래와 같이 기록하였다.

  • (100+1+ | 01)+

김동혁 박사는 다양한 전파 기록 중에서 위의 패턴을 지니는 전파를 가려내는 프로그램을 필요로 한다. 이를 수행할 수 있는 프로그램을 작성하라.

입력

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 전파를 표현하는, { 0, 1 }만으로 이루어진 문자열이 공백 없이 주어진다. 문자열 길이는 (1 ≤ N ≤ 200)의 범위를 갖는다.

출력

각 테스트 케이스에 대해 주어진 전파가 문제에서 제시한 패턴이면 “YES”를 그렇지 않은 경우는 “NO”를 출력한다. 출력 문자열은 모두 대문자로 구성되어 있다.

예제 입력 1

3
10010111
011000100110001
0110001011001

예제 출력 1

NO
NO
YES

더보기

Solution

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

int main(void)
{
	int T;
	bool VegaCheck[10]={false, false, false, true, false, false, false, true, true, false};

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		int state=0;
		char str[201]={'\0', };

		scanf("%s", str);

		for(int i=0;i<strlen(str);i++)
			switch(state)
			{
				case 0:
						state=str[i]=='0'?1:4;
						break;
				case 1:
						state=str[i]=='0'?2:3;
						break;
				case 3:
						state=str[i]=='0'?1:4;
						break;
				case 4:
						state=str[i]=='0'?5:2;
						break;
				case 5:
						state=str[i]=='0'?6:2;
						break;
				case 6:
						state=str[i]=='0'?6:7;
						break;
				case 7:
						state=str[i]=='0'?1:8;
						break;
				case 8:
						state=str[i]=='0'?9:8;
						break;
				case 9:
						state=str[i]=='0'?6:3;
						break;
				default:
						break;
			}

		printf("%s\n", VegaCheck[state]?"YES":"NO");
	}

	return 0;
}

DFA

728x90

+ Recent posts