문제

접미사 배열은 문자열 S의 모든 접미사를 사전순으로 정렬해 놓은 배열이다.

baekjoon의 접미사는 baekjoon, aekjoon, ekjoon, kjoon, joon, oon, on, n 으로 총 8가지가 있고, 이를 사전순으로 정렬하면, aekjoon, baekjoon, ekjoon, joon, kjoon, n, on, oon이 된다.

문자열 S가 주어졌을 때, 모든 접미사를 사전순으로 정렬한 다음 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 문자열 S가 주어진다. S는 알파벳 소문자로만 이루어져 있고, 길이는 1,000보다 작거나 같다.

출력

첫째 줄부터 S의 접미사를 사전순으로 한 줄에 하나씩 출력한다.

예제 입력 1

baekjoon

예제 출력 1

aekjoon
baekjoon
ekjoon
joon
kjoon
n
on
oon

더보기

Solution

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

int main(void)
{
	int length;
	char S[1001]={'\0', }, **smaller=NULL;

	scanf("%s", S);
	length=strlen(S);
	smaller=(char **)malloc(length*sizeof(char *));
	for(int i=0;i<length;i++)
	{
		smaller[i]=(char *)calloc(length+1,sizeof(char));
		strcpy(smaller[i],S+i);
	}

	for(int i=0;i<length-1;i++)
		for(int j=i+1;j<length;j++)
			if(strcmp(smaller[i],smaller[j])>0)
			{
				char temp[1001]={'\0', };

				strcpy(temp,smaller[i]);
				strcpy(smaller[i],smaller[j]);
				strcpy(smaller[j],temp);
			}

	for(int i=0;i<length;i++)
	{
		printf("%s\n", smaller[i]);
		free(smaller[i]);
	}
	free(smaller);
	return 0;
}
728x90

문제

체스판은 8*8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다. 가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램을 작성하시오.

입력

첫째 줄부터 8개의 줄에 체스판의 상태가 주어진다. ‘.’은 빈 칸이고, ‘F’는 위에 말이 있는 칸이다.

출력

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

예제 입력 1

.F.F...F
F...F.F.
...F.F.F
F.F...F.
.F...F..
F...F.F.
.F.F.F.F
..FF..F.

예제 출력 1

1

더보기

Solution

#include<stdio.h>

int main(void)
{
	int count=0;
	char chess[8][9]={'\0', };

	for(int i=0;i<8;i++)
		scanf("%s", chess[i]);

	for(int i=0;i<8;i++)
		for(int j=0;j<8;j++)
			count+=(i+j)%2==0&&chess[i][j]=='F';

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

	return 0;
}
728x90

문제

시작 -> 실행 -> cmd를 쳐보자. 검정 화면이 눈에 보인다. 여기서 dir이라고 치면 그 디렉토리에 있는 서브디렉토리와 파일이 모두 나온다. 이때 원하는 파일을 찾으려면 다음과 같이 하면 된다.

dir *.exe라고 치면 확장자가 exe인 파일이 다 나온다. "dir 패턴"과 같이 치면 그 패턴에 맞는 파일만 검색 결과로 나온다. 예를 들어, dir a?b.exe라고 검색하면 파일명의 첫 번째 글자가 a이고, 세 번째 글자가 b이고, 확장자가 exe인 것이 모두 나온다. 이때 두 번째 문자는 아무거나 나와도 된다. 예를 들어, acb.exe, aab.exe, apb.exe가 나온다.

이 문제는 검색 결과가 먼저 주어졌을 때, 패턴으로 뭘 쳐야 그 결과가 나오는지를 출력하는 문제이다. 패턴에는 알파벳과 "." 그리고 "?"만 넣을 수 있다. 가능하면 ?을 적게 써야 한다. 그 디렉토리에는 검색 결과에 나온 파일만 있다고 가정하고, 파일 이름의 길이는 모두 같다.

입력

첫째 줄에 파일 이름의 개수 N이 주어진다. 둘째 줄부터 N개의 줄에는 파일 이름이 주어진다. N은 50보다 작거나 같은 자연수이고 파일 이름의 길이는 모두 같고 길이는 최대 50이다. 파일이름은 알파벳과 "." 그리고 "?"로만 이루어져 있다.

출력

첫째 줄에 패턴을 출력하면 된다.

예제 입력 1

3
config.sys
config.inf
configures

예제 출력 1

config????

더보기

Solution

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

int main(void)
{
	int N, *different=NULL;
	char **str=NULL;

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

	for(int i=0;i<N;i++)
		scanf("%s", str[i]);
	different=(int *)calloc(strlen(str[0]),sizeof(int));

	for(int i=0;i<N-1;i++)
		for(int j=i+1;j<N;j++)
			for(int k=0;k<strlen(str[0]);k++)
			{
				if(different[k])
					continue;
				if(str[i][k]!=str[j][k])
				{
					different[k]=1;
					str[0][k]='?';
				}
			}

	printf("%s\n", str[0]);

	for(int i=0;i<N;i++)
		free(str[i]);
	free(str);
	free(different);
	return 0;
}
728x90

문제

왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다.

아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다.

아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.

입력

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

출력

일곱 난쟁이의 키를 오름차순으로 출력한다. 일곱 난쟁이를 찾을 수 없는 경우는 없다.

예제 입력 1

20
7
23
19
10
15
25
8
13

예제 출력 1

7
8
10
13
19
20
23

더보기

Solution

#include<stdio.h>

int main(void)
{
	int dwarf[9];

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

	for(int i=0;i<8;i++)
	{
		int sum=0;
		for(int j=i+1;j<9;j++)
		{
			sum=0;

			for(int d=0;d<9;d++)
				if(d==i || d==j)
					continue;
				else
					sum+=dwarf[d];
			if(sum==100)
			{
				dwarf[i]=dwarf[j]=0;
				break;
			}
		}

		if(sum==100)
			break;
	}

	for(int i=0;i<8;i++)
		for(int j=i+1;j<9;j++)
			if(dwarf[i]>dwarf[j])
			{
				int temp=dwarf[i];
				dwarf[i]=dwarf[j];
				dwarf[j]=temp;
			}

	for(int i=2;i<9;i++)
		printf("%d\n", dwarf[i]);

	return 0;
}
728x90

문제

지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대를 만들려고 한다.

막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 지민이는 아래와 같은 과정을 거쳐서 막대를 자르려고 한다.

  1. 지민이가 가지고 있는 막대의 길이를 모두 더한다. 처음에는 64cm 막대 하나만 가지고 있다. 이때, 합이 X보다 크다면, 아래와 같은 과정을 반복한다.
    1. 가지고 있는 막대 중 길이가 가장 짧은 것을 절반으로 자른다.
    2. 만약, 위에서 자른 막대의 절반 중 하나를 버리고 남아있는 막대의 길이의 합이 X보다 크거나 같다면, 위에서 자른 막대의 절반 중 하나를 버린다.
  2. 이제, 남아있는 모든 막대를 풀로 붙여서 Xcm를 만든다.

X가 주어졌을 때, 위의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 구하는 프로그램을 작성하시오. 

입력

첫째 줄에 X가 주어진다. X는 64보다 작거나 같은 자연수이다.

출력

문제의 과정을 거친다면, 몇 개의 막대를 풀로 붙여서 Xcm를 만들 수 있는지 출력한다.

예제 입력 1

23

예제 출력 1

4

예제 입력 2

32

예제 출력 2

1

예제 입력 3

64

예제 출력 3

1

예제 입력 4

48

예제 출력 4

2

더보기

Solution

#include<stdio.h>

int main(void)
{
	int X, size=64, count=0;

	scanf("%d", &X);

	do
	{
		if(size<=X)
		{
			X-=size;
			count++;
		}
		size/=2;
	}
	while(X>0);

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

	return 0;
}
728x90

문제

총 N개의 시험장이 있고, 각각의 시험장마다 응시자들이 있다. i번 시험장에 있는 응시자의 수는 Ai명이다.

감독관은 총감독관과 부감독관으로 두 종류가 있다. 총감독관은 한 시험장에서 감시할 수 있는 응시자의 수가 B명이고, 부감독관은 한 시험장에서 감시할 수 있는 응시자의 수가 C명이다.

각각의 시험장에 총감독관은 오직 1명만 있어야 하고, 부감독관은 여러 명 있어도 된다.

각 시험장마다 응시생들을 모두 감시해야 한다. 이때, 필요한 감독관 수의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 시험장의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

둘째 줄에는 각 시험장에 있는 응시자의 수 Ai (1 ≤ Ai ≤ 1,000,000)가 주어진다.

셋째 줄에는 B와 C가 주어진다. (1 ≤ B, C ≤ 1,000,000)

출력

각 시험장마다 응시생을 모두 감독하기 위해 필요한 감독관의 최소 수를 출력한다.

예제 입력 1

1
1
1 1

예제 출력 1

1

예제 입력 2

3
3 4 5
2 2

예제 출력 2

7

예제 입력 3

5
1000000 1000000 1000000 1000000 1000000
5 7

예제 출력 3

714290

예제 입력 4

5
10 9 10 9 10
7 20

예제 출력 4

10

예제 입력 5

5
10 9 10 9 10
7 2

예제 출력 5

13

더보기

Solution

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

int main(void)
{
	int N, *A=NULL, B, C;
	long long int count=0;

	scanf("%d", &N);
	A=(int *)malloc(N*sizeof(int));

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

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

	for(int i=0;i<N;i++)
		if(A[i]<=B)
			count++;
		else if((A[i]-B)%C==0)
			count+=(A[i]-B)/C+1;
		else
			count+=(A[i]-B)/C+2;

	printf("%lld\n", count);

	free(A);
	return 0;
}
728x90

문제

오른쪽 그림과 같이 삼각형이 나선 모양으로 놓여져 있다. 첫 삼각형은 정삼각형으로 변의 길이는 1이다. 그 다음에는 다음과 같은 과정으로 정삼각형을 계속 추가한다. 나선에서 가장 긴 변의 길이를 k라 했을 때, 그 변에 길이가 k인 정삼각형을 추가한다.

파도반 수열 P(N)은 나선에 있는 정삼각형의 변의 길이이다. P(1)부터 P(10)까지 첫 10개 숫자는 1, 1, 1, 2, 2, 3, 4, 5, 7, 9이다.

N이 주어졌을 때, P(N)을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, N이 주어진다. (1 ≤ N ≤ 100)

출력

각 테스트 케이스마다 P(N)을 출력한다.

예제 입력 1

2
6
12

예제 출력 1

3
16

더보기

Solution

#include<stdio.h>

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

	scanf("%d", &T);

	for(int i=5;i<100;i++)
		length[i+1]=length[i-1]+length[i-2];

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

	return 0;
}
728x90

문제

3개의 시간조절용 버튼 A B C가 달린 전자레인지가 있다. 각 버튼마다 일정한 시간이 지정되어 있어 해당 버튼을 한번 누를 때마다 그 시간이 동작시간에 더해진다. 버튼 A, B, C에 지정된 시간은 각각 5분, 1분, 10초이다.

냉동음식마다 전자레인지로 요리해야할 시간 T가 초단위로 표시되어 있다. 우리는 A, B, C 3개의 버튼을 적절히 눌러서 그 시간의 합이 정확히 T초가 되도록 해야 한다. 단 버튼 A, B, C를 누른 횟수의 합은 항상 최소가 되어야 한다. 이것을 최소버튼 조작이라고 한다. 

만일 요리시간이 100초라고 하면(T=100) B를 1번, C는 4번 누르면 된다. 이와 다르게 C를 10번 눌러도 100초가 되지만 이 경우 10번은 최소 횟수가 아니기 때문이 답이 될 수 없다. 이 경우 B 1번, C 4번, 총 5번이 최소버튼 조작이다. 그리고 T=234와 같이 3개의 버튼으로 시간을 정확히 맞출 수 없는 경우도 있다. 

여러분은 주어진 요리시간 T초를 맞추기 위한 최소버튼 조작 방법을 구하는 프로그램을 작성해야 한다. 

입력

첫 번째 줄에는 요리시간 T(초)가 정수로 주어져 있으며 그 범위는 1 ≤ T ≤ 10,000 이다. 

출력

여러분은 T초를 위한 최소버튼 조작의 A B C 횟수를 첫 줄에 차례대로 출력해야 한다. 각각의 횟수 사이에는 빈 칸을 둔다. 해당 버튼을 누르지 않는 경우에는 숫자 0을 출력해야한다. 만일 제시된 3개의 버튼으로 T초를 맞출 수 없으면 음수 -1을 첫 줄에 출력해야 한다. 

예제 입력 1

100

예제 출력 1

0 1 4

더보기

Solution

#include<stdio.h>

int main(void)
{
	int A, B, T;

	scanf("%d", &T);

	A=T/300;
	T%=300;
	B=T/60;
	T%=60;
	if(T%10==0)
		printf("%d %d %d\n", A, B, T/10);
	else
		printf("-1\n");

	return 0;
}
728x90

+ Recent posts