문제

N(1≤N≤100,000)개의 로프가 있다. 이 로프를 이용하여 이런 저런 물체를 들어올릴 수 있다. 각각의 로프는 그 굵기나 길이가 다르기 때문에 들 수 있는 물체의 중량이 서로 다를 수도 있다.

하지만 여러 개의 로프를 병렬로 연결하면 각각의 로프에 걸리는 중량을 나눌 수 있다. k개의 로프를 사용하여 중량이 w인 물체를 들어올릴 때, 각각의 로프에는 모두 고르게 w/k 만큼의 중량이 걸리게 된다.

각 로프들에 대한 정보가 주어졌을 때, 이 로프들을 이용하여 들어올릴 수 있는 물체의 최대 중량을 구해내는 프로그램을 작성하시오. 모든 로프를 사용해야 할 필요는 없으며, 임의로 몇 개의 로프를 골라서 사용해도 된다.

입력

첫째 줄에 정수 N이 주어진다. 다음 N개의 줄에는 각 로프가 버틸 수 있는 최대 중량이 주어진다. 이 값은 10,000을 넘지 않는 자연수이다.

출력

첫째 줄에 답을 출력한다.

예제 입력 1

2
10
15

예제 출력 1

20

더보기

Solution

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

#define SWAP(x,y,z) ((z)=(x), (x)=(y), (y)=(z))

int partition(int list[],int left,int right)
{
	int pivot=list[left], low=left, high=right+1, temp;

	do
	{
		do
			low++;
		while(low<=high && list[low]<pivot);
		do
			high--;
		while(high>=left && list[high]>pivot);

		if(low<high)
			SWAP(list[low],list[high],temp);
	}
	while(low<high);

	SWAP(list[left],list[high],temp);

	return high;
}

void quick_sort(int list[],int left,int right)
{
	if(left<right)
	{
		int q=partition(list,left,right);
		quick_sort(list,left,q-1);
		quick_sort(list,q+1,right);
	}
}

int main(void)
{
	int N, max=0, *rope=NULL;

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

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

	quick_sort(rope,0,N-1);

	for(int i=0;i<N;i++)
		max=(N-i)*rope[i]>max?(N-i)*rope[i]:max;

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

	free(rope);
	return 0;
}
728x90

문제

N개의 정수가 주어진다. 이때, N개의 정수를 오름차순으로 정렬하는 프로그램을 작성하시오. 같은 정수는 한 번만 출력한다.

입력

첫째 줄에 수의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다.

출력

첫째 줄에 수를 오름차순으로 정렬한 결과를 출력한다. 이때, 같은 수는 한 번만 출력한다.

예제 입력 1

10
1 4 2 3 1 4 2 3 1 2

예제 출력 1

1 2 3 4

더보기

Solution

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

int main(void)
{
	bool number[2001]={false, };
	int N;

	scanf("%d", &N);

	for(int i=0;i<N;i++)
	{
		int temp;

		scanf("%d", &temp);

		number[temp+1000]=true;
	}

	for(int i=0;i<2001;i++)
		if(number[i])
			printf("%d ", i-1000);
	printf("\n");

	return 0;
}
728x90

문제

5명의 요원 중 FBI 요원을 찾는 프로그램을 작성하시오.

FBI요원은 요원의 첩보원명에 FBI가 들어있다. 

입력

5개 줄에 요원의 첩보원명이 주어진다. 첩보원명은 알파벳 대문자, 숫자 0~9, 대시 (-)로만 이루어져 있으며, 최대 10글자이다.

출력

첫째 줄에 FBI 요원을 출력한다. 이때, 해당하는 요원이 몇 번째 입력인지를 공백으로 구분하여 출력해야 하며, 오름차순으로 출력해야 한다. 만약 FBI 요원이 없다면 "HE GOT AWAY!"를 출력한다.

예제 입력 1

47-FBI
BOND-007
RF-FBI18
MARICA-13
13A-FBILL

예제 출력 1

1 3 5

더보기

Solution

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

int main(void)
{
	bool isFBI[5]={false, }, morethanzero=false;

	for(int i=0;i<5;i++)
	{
		char name[11]={'\0', };

		scanf("%s", name);

		if(strstr(name,"FBI")!=NULL)
		{
			morethanzero=true;
			isFBI[i]=true;
		}
	}

	if(!morethanzero)
		printf("HE GOT AWAY!\n");
	else
	{
		for(int i=0;i<5;i++)
			if(isFBI[i])
		printf("%d ", i+1);
		printf("\n");
	}

	return 0;
}
728x90

문제

ICPC Bangkok Regional에 참가하기 위해 수완나품 국제공항에 막 도착한 팀 레드시프트 일행은 눈을 믿을 수 없었다. 공항의 대형 스크린에 올해가 2562년이라고 적혀 있던 것이었다.

불교 국가인 태국은 불멸기원(佛滅紀元), 즉 석가모니가 열반한 해를 기준으로 연도를 세는 불기를 사용한다. 반면, 우리나라는 서기 연도를 사용하고 있다. 불기 연도가 주어질 때 이를 서기 연도로 바꿔 주는 프로그램을 작성하시오.

입력

서기 연도를 알아보고 싶은 불기 연도 y가 주어진다. (1000 ≤ y ≤ 3000)

출력

불기 연도를 서기 연도로 변환한 결과를 출력한다.

예제 입력 1

2541

예제 출력 1

1998

더보기

Solution

#include<stdio.h>

int main(void)
{
	int y;

	scanf("%d", &y);

	printf("%d\n", y-543);

	return 0;
}
728x90

문제

선풍기 사망설(fan death)은 우리나라에 존재하는 미신 중 하나이다. BOJ에도 fan death가 있는데, 그것은 BOJ를 만든 백준님에 대한 팬심을 치사량 이상으로 흡입(?)하여 사망하게 된다는 미신이다.

이 문제에서는 당신이 fan death에 다다를 수 있을 정도로 백준님과 BOJ를 사랑하는지 확인할 것이다.

자연수 n이 주어졌을 때, n의 모든 약수(1과 n을 포함)의 합을 구하시오.

이 문단은 광고 차단 기능을 쓰지 않는 유저에게만 보인다. BOJ에게 광고비를 제공할 의향이 있는 당신은 충분한 팬심을 가지고 있다. 이제 구한 값에 5를 곱하고 24를 빼서 출력하면 된다.

입력

자연수 n(1 ≤ n ≤ 10,000)이 한 줄에 걸쳐 주어진다.

출력

답을 출력한다.

예제 입력 1

5

예제 출력 1

6

더보기

Solution

#include<stdio.h>

int main(void)
{
	int n, sum=0;

	scanf("%d", &n);

	for(int i=1;i*i<=n;i++)
		if(n%i==0)
		{
			sum+=i;
			if(i*i!=n)
				sum+=n/i;
		}

	printf("%d\n", sum*5-24);

	return 0;
}
728x90

문제

두 영어 단어가 철자의 순서를 뒤바꾸어 같아질 수 있을 때, 그러한 두 단어를 서로 애너그램 관계에 있다고 한다. 예를 들면 occurs 라는 영어 단어와 succor 는 서로 애너그램 관계에 있는데, occurs의 각 문자들의 순서를 잘 바꾸면 succor이 되기 때문이다.

한 편, dared와 bread는 서로 애너그램 관계에 있지 않다. 하지만 dared에서 맨 앞의 d를 제거하고, bread에서 제일 앞의 b를 제거하면, ared와 read라는 서로 애너그램 관계에 있는 단어가 남게 된다.

두 개의 영어 단어가 주어졌을 때, 두 단어가 서로 애너그램 관계에 있도록 만들기 위해서 제거해야 하는 최소 개수의 문자 수를 구하는 프로그램을 작성하시오. 문자를 제거할 때에는 아무 위치에 있는 문자든지 제거할 수 있다.

입력

첫째 줄과 둘째 줄에 영어 단어가 소문자로 주어진다. 각각의 길이는 1,000자를 넘지 않으며, 적어도 한 글자로 이루어진 단어가 주어진다.

출력

첫째 줄에 답을 출력한다.

예제 입력 1

aabbcc
xxyybb

예제 출력 1

8

더보기

Solution

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

int main(void)
{
	int alphabet[2][26]={0, }, difference=0;

	for(int i=0;i<2;i++)
	{
		char c=getchar();

		while(c!='\n')
		{
			alphabet[i][c-'a']++;
			c=getchar();
		}
	}

	for(int i=0;i<26;i++)
		difference+=abs(alphabet[0][i]-alphabet[1][i]);

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

	return 0;
}
728x90

문제

천나라 민호성의 지영 공주님은 매우 아름답다. 공주님 자신도 이 세상 그 누구보다 자신이 아름답다는 것을 알고 있다. 공주님은 자신의 아름다움이 세월의 저편으로 사라지는 것을 매우 두려워한다. 그래서 하루에도 수십 수백 번씩 거울을 보며 자신의 모습이 여전히 아름다운지 확인을 거듭한다. 그러던 어느 날, 세상의 다양한 장면들을 담고 싶었던 공주님의 마법거울은 매일 똑같은 모습만을 비추는 자신의 운명에 좌절하며 앞으로의 운명을 개척하기로 결심했다. 마법거울은 매일 자신의 심리상태에 따라 거울에 비친 공주님의 모습을 좌/우 또는 상/하로 반전시켜 비추기로 한다. 마법거울의 심리상태는 1부터 3까지의 자연수로 표현할 수 있으며, 숫자가 클수록 더 화가 난 상태를 의미한다. 마법거울의 심리상태가 1일 때는 지영 공주님의 모습을 있는 그대로 표현하고, 2일 때는 좌/우로 반전된 모습을, 3일 때는 상/하로 반전된 모습을 표현한다. 정사각형 형태의 마법거울의 크기와 거울에 비친 지영 공주님의 원래 모습, 마법거울의 심리상태가 주어졌을 때, 마법거울에 비친 지영 공주님의 모습을 출력하라.

입력

첫 번째 줄에 정사각형 모양의 마법거울의 크기를 나타내는 자연수 N(2 ≤ N ≤ 100)이 입력된다. 그 다음 N개의 줄에 걸쳐 거울에 비친 지영 공주님의 원래 모습이 각 줄에 N개의 문자로 표현된다. 마법거울은 알파벳 대소문자로만 거울에 비친 상을 표현할 수 있다. 마지막 줄에 마법거울의 심리상태를 나타내는 정수 K(1 ≤ K ≤ 3)가 주어진다.

출력

마법거울의 심리상태에 따라 거울에 비친 지영공주님의 모습을 N×N크기의 정사각형 형태로 출력하라. 반전된 모습은 입력으로 주어진 문자의 위치를 반전시키는 것을 의미한다.

예제 입력 1

8
00000000
0KK00EE0
0KK00EE0
000SS000
000SS000
0A0000A0
00AAAA00
00000000
3

예제 출력 1

00000000
00AAAA00
0A0000A0
000SS000
000SS000
0KK00EE0
0KK00EE0
00000000

더보기

Solution

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

int main(void)
{
	int N, K;
	char **mirror=NULL;

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

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

	if(K==1)
		for(int i=0;i<N;i++)
			printf("%s\n", mirror[i]);
	else if(K==2)
		for(int i=0;i<N;i++)
		{
			for(int j=N-1;j>=0;j--)
				printf("%c", mirror[i][j]);
			printf("\n");
		}
	else
		for(int i=N-1;i>=0;i--)
			printf("%s\n", mirror[i]);

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

문제

숫자와 콤마로만 이루어진 문자열 S가 주어진다. 이때, S에 포함되어있는 자연수의 합을 구하는 프로그램을 작성하시오.

S의 첫 문자와 마지막 문자는 항상 숫자이고, 콤마는 연속해서 주어지지 않는다. 주어지는 수는 항상 자연수이다.

입력

첫째 줄에 문자열 S가 주어진다. S의 길이는 최대 100이다. 포함되어있는 정수는 1,000,000보다 작거나 같은 자연수이다.

출력

문자열 S에 포함되어 있는 자연수의 합을 출력한다.

예제 입력 1

10,20,30,50,100

예제 출력 1

210

더보기

Solution

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

int main(void)
{
	char S[101]={'\0', };
	int sum=0, temp=0;

	scanf("%s", S);

	for(int i=0;i<strlen(S);i++)
		if(S[i]==',')
		{
			sum+=temp;
			temp=0;
		}
		else
		{
			temp*=10;
			temp+=S[i]-'0';
		}
	sum+=temp;

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

	return 0;
}
728x90

+ Recent posts