문제

정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 다섯 가지이다.

  • push X: 정수 X를 스택에 넣는 연산이다.
  • pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 스택에 들어있는 정수의 개수를 출력한다.
  • empty: 스택이 비어있으면 1, 아니면 0을 출력한다.
  • top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

예제 입력 1

14
push 1
push 2
top
size
empty
pop
pop
pop
size
empty
pop
push 3
empty
top

예제 출력 1

2
2
0
2
1
-1
0
1
-1
0
3

예제 입력 2

7
pop
top
push 123
top
pop
top
pop

예제 출력 2

-1
-1
123
123
-1
-1

더보기

Solution

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

int main(void)
{
	int state=0, *stack=NULL, N;

	scanf("%d", &N);
	stack=(int *)malloc(N*sizeof(int));
	while(getchar()!='\n');

	for(int i=0;i<N;i++)
	{
		char statement[15]={'\0', };
		fgets(statement,sizeof(statement),stdin);

		if(strncmp(statement,"push",4)==0)
		{
			int num=0;
			for(int j=5;statement[j]!='\0';j++)
				statement[j-5]=statement[j];
			num=atoi(statement);
			stack[state++]=num;
		}
		else if(strncmp(statement,"pop",3)==0)
			printf("%d\n", state==0?-1:stack[--state]);
		else if(strncmp(statement,"size",4)==0)
			printf("%d\n", state);
		else if(strncmp(statement,"empty",5)==0)
			printf("%d\n", state==0);
		else if(strncmp(statement,"top",3)==0)
			printf("%d\n", state==0?-1:stack[state-1]);
		else
			printf("error: %s", statement);
	}

	return 0;
}
728x90

문제

N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.

출력

입력으로 주어진 숫자 N개의 합을 출력한다.

예제 입력 1

1
1

예제 출력 1

1

예제 입력 2

5
54321

예제 출력 2

15

예제 입력 3

25
7000000000000000000000000

예제 출력 3

7

문제 입력 4

11
10987654321

예제 출력 4

46

더보기

Solution

#include<stdio.h>

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

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

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

	return 0;
}
728x90

문제

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

입력

첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.

출력

첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

예제 입력 1

Mississipi

예제 출력 1

?

예제 입력 2

zZa

예제 출력 2

Z

예제 입력 3

z

예제 출력 3

Z

예제 입력 4

baaa

예제 출력 4

A

더보기

Solution

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

int main(void)
{
	char word[1000000]={'\0', }, character;
	int N, alphabet[26]={0, }, pri=-1, sec=-1;

	fgets(word,sizeof(word),stdin);
	N=strlen(word);

	for(int i=0;i<N;i++)
		alphabet[word[i]>='a'?word[i]-'a':word[i]-'A']++;

	for(int i=0;i<26;i++)
		if(alphabet[i]>pri)
		{
			pri=alphabet[i];
			character='A'+i;
		}
		else if(alphabet[i]>sec)
			sec=alphabet[i];

	printf("%c\n", pri==sec?'?':character);

	return 0;
}
728x90

문제

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.

"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.

출력

각 테스트 케이스마다 점수를 출력한다.

예제 입력 1

5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX

예제 출력 1

10
9
7
55
30

더보기

Solution

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

int main(void)
{
	int T;

	scanf("%d", &T);
	while(getchar()!='\n');

	for(int i=0;i<T;i++)
	{
		int score=0, con=1;
		char mark[80]={'\0', };

		gets(mark);
		for(int j=0;j<strlen(mark);j++)
			if(mark[j]=='O')
				score+=con++;
			else
				con=1;
		printf("%d\n", score);
	}

	return 0;
}
728x90

문제

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

입력

첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

출력

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

예제 입력 1

5
5 50 50 70 80 100
7 100 95 90 80 70 60 50
3 70 90 80
3 70 90 81
9 100 99 98 97 96 95 94 93 91

예제 출력 1

40.000%
57.143%
33.333%
66.667%
55.556%

더보기

Solution

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

int main(void)
{
	int C;

	scanf("%d", &C);

	for(int i=0;i<C;i++)
	{
		int N, *score=NULL, count=0;
		float avr=0.0;

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

		for(int j=0;j<N;j++)
		{
			scanf("%d", &score[j]);
			avr+=(float)score[j];
		}
		avr/=N;

		for(int j=0;j<N;j++)
			count+=score[j]>avr;

		printf("%.3f%%\n", (100.0*count)/N);
		free(score);
	}

	return 0;
}
728x90

문제

영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

입력

첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열의 앞과 뒤에는 공백이 있을 수도 있다.

출력

첫째 줄에 단어의 개수를 출력한다.

예제 입력 1

The Curious Case of Benjamin Button

예제 출력 1

6

예제 입력 2

 Mazatneunde Wae Teullyeoyo

예제 출력 2

3

예제 입력 3

Teullinika Teullyeotzi 

예제 출력 3

2

더보기

Solution

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

int main(void)
{
	char str[1000001];
	int count=0;

	fgets(str,sizeof(str),stdin);

	for(int i=0;i<strlen(str);i++)
		if(i==0&&isalpha(str[i]))
			count++;
		else if(i==0)
			continue;
		else if(!isalpha(str[i-1])&&isalpha(str[i]))
			count++;

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

문제

세 개의 자연수 A, B, C가 주어질 때 A×B×C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오.

예를 들어 A = 150, B = 266, C = 427 이라면 

A × B × C = 150 × 266 × 427 = 17037300 이 되고, 

계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.

입력

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 같거나 크고, 1,000보다 작은 자연수이다.

출력

첫째 줄에는 A×B×C의 결과에 0 이 몇 번 쓰였는지 출력한다. 마찬가지로 둘째 줄부터 열 번째 줄까지 A×B×C의 결과에 1부터 9까지의 숫자가 각각 몇 번 쓰였는지 차례로 한 줄에 하나씩 출력한다.

예제 입력 1

150
266
427

예제 출력 1

3
1
0
2
0
0
0
2
0
0

더보기

Solution

#include<stdio.h>

int main(void)
{
	int temp, mul=1, frequency[10]={0, };

	for(int i=0;i<3;i++)
	{
		scanf("%d", &temp);
		mul*=temp;
	}

	while(mul>0)
	{
		frequency[mul%10]++;
		mul/=10;
	}

	for(int i=0;i<10;i++)
		printf("%d\n", frequency[i]);

	return 0;
}
728x90

문제

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

출력

첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.

예제 입력 1

2 1 5

예제 출력 1

4

더보기

Solution

#include<stdio.h>

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

	scanf("%d %d %d", &A, &B, &V);

	printf("%d\n", V<A?1:(V-A)%(A-B)==0?(V-A)/(A-B)+1:(V-A)/(A-B)+2);

	return 0;
}
728x90

+ Recent posts