문제

두 정수 N과 F가 주어진다. 지민이는 정수 N의 가장 뒤 두 자리를 적절히 바꿔서 N을 F로 나누어 떨어지게 만들려고 한다. 만약 가능한 것이 여러 가지이면, 뒤 두 자리를 가능하면 작게 만들려고 한다.

예를 들어, N=275이고, F=5이면, 답은 00이다. 200이 5로 나누어 떨어지기 때문이다. N=1021이고, F=11이면, 정답은 01인데, 1001이 11로 나누어 떨어지기 때문이다.

입력

첫째 줄에 N, 둘째 줄에 F가 주어진다. N은 100보다 크거나 같고, 2,000,000,000보다 작거나 같은 자연수이다. F는 100보다 작거나 같은 자연수이다.

출력

첫째 줄에 마지막 두 자리를 모두 출력한다. 한자리이면 앞에 0을 추가해서 두 자리로 만들어야 한다.

예제 입력 1

1000
3

예제 출력 1

02

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N, F;

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

	for(int i=0;i<100;i++)
		if((N-N%100+i)%F==0)
		{
			printf("%02d\n", i);
			break;
		}

	return 0;
}

 

728x90

문제

캥거루 세 마리가 사막에서 놀고 있다. 사막에는 수직선이 하나 있고, 캥거루는 서로 다른 한 좌표 위에 있다.

한 번 움직일 때, 바깥쪽의 두 캥거루 중 한 마리가 다른 두 캥거루 사이의 정수 좌표로 점프한다. 한 좌표 위에 있는 캥거루가 두 마리 이상일 수는 없다.

캥거루는 최대 몇 번 움직일 수 있을까?

입력

첫째 줄에 세 캥거루의 초기 위치 A, B, C가 주어진다. (0 < A < B < C < 100)

출력

캥거루가 최대 몇 번 움직일 수 있는지 출력한다.

예제 입력 1

3 5 9

예제 출력 1

3

더보기

Solution

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

int compare(const void *x,const void *y)
{
	return *(int *)x>*(int *)y?1:*(int *)x==*(int *)y?0:-1;
}

int main(void)
{
	int kangaroo[3], count=0;

	for(int i=0;i<3;i++)
		scanf("%d", &kangaroo[i]);
	qsort((void *)kangaroo,(size_t)3,sizeof(int),compare);

	while(kangaroo[1]-kangaroo[0]>1 || kangaroo[2]-kangaroo[1]>1)
	{
		if(kangaroo[1]-kangaroo[0]>kangaroo[2]-kangaroo[1])
		{
			kangaroo[2]=kangaroo[1];
			kangaroo[1]--;
		}
		else
		{
			kangaroo[0]=kangaroo[1];
			kangaroo[1]++;
		}

		count++;
	}

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

문제

neighbor 블로그를 운영하는 일우는 매일 아침 풀고 싶은 문제를 미리 정해놓고 글을 올린다. 그리고 매일 밤 각각의 문제에 대하여, 해결한 경우 파란색, 해결하지 못한 경우 빨간색으로 칠한다. 일우는 각 문제를 칠할 때 아래와 같은 과정을 한 번의 작업으로 수행한다.

  1. 연속된 임의의 문제들을 선택한다.
  2. 선택된 문제들을 전부 원하는 같은 색으로 칠한다.

예를 들어, 각 문제를 위와 같은 색으로 칠하려고 할 때, 1~2번 문제를 파란색, 3번을 빨간색, 4번을 파란색, 5번을 빨간색, 6~7번을 파란색, 8번을 빨간색으로 칠하는 작업을 순서대로 수행하면 6번의 작업을 거쳐야 한다. 하지만, 1~7번 문제를 파란색, 3번을 빨간색, 5번을 빨간색, 8번을 빨간색으로 순서대로 칠한다면 작업 횟수는 4번으로 가장 적다.

일우는 매일 500,000문제까지 시도하기 때문에, 이 작업이 꽤나 귀찮아지기 시작했다. 그래서 가장 효율적인 방법으로 위 작업을 수행하기를 원한다. 일우를 도와 각 문제를 주어진 색으로 칠할 때 필요한 최소한의 작업 횟수를 구하는 프로그램을 작성하라.

입력

첫째 줄에 색을 칠해야 하는 문제의 수 N (1 ≤ N ≤ 500,000)이 주어진다.

둘째 줄에 N개의 문자가 공백 없이 순서대로 주어진다. 각 문자는 i번째 문제를 어떤 색으로 칠해야 하는지를 의미하며, R은 빨간색, B는 파란색을 나타낸다. 그 외에 다른 문자는 주어지지 않는다.

출력

첫째 줄에 일우가 주어진 모든 문제를 원하는 색으로 칠할 때까지 필요한 작업 횟수의 최솟값을 출력하라.

예제 입력 1

8
BBRBRBBR

예제 출력 1

4

위의 예시와 같다.


더보기

Solution

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

int main(void)
{
	int N, redcount=0, bluecount=0;
	char *problem=NULL;

	scanf("%d", &N);
	problem=(char *)malloc((N+1)*sizeof(char));
	scanf("%s", problem);

	for(int i=1;i<strlen(problem);i++)
		if(problem[i]!=problem[i-1])
		{
			if(problem[i-1]=='R')
				redcount++;
			else
				bluecount++;
		}
	if(problem[strlen(problem)-1]=='R')
		redcount++;
	else
		bluecount++;

	printf("%d\n", redcount<bluecount?redcount+1:bluecount+1);
	free(problem);
	return 0;
}
728x90

문제

꽉꽉나라의 농부 오리는 당근을 키우려고 한다. 꽉꽉나라에서는 씨앗이 X만큼의 온기와 Y만큼의 수분을 가지면 당근으로 자란다고 한다.

씨앗은 햇빛을 1번 받을 때마다 1만큼의 온기가 증가하고, 햇빛을 10번 받을 때마다 1만큼의 수분이 감소한다.

씨앗은 물을 1번 받을 때마다 1만큼의 수분이 증가하고, 물을 10번 받을 때마다 1만큼의 온기가 감소한다.

만약, 감소되어야 하는 온기 혹은 수분이 이미 0이라면 감소되지 않는다. 즉, 온기와 수분은 음수가 되지 않는다. 맨 처음 씨앗의 온기와 수분은 0이다.

오리는 당근을 효율적으로 키우기 위해, 당근이 자랄 때까지 햇빛과 물을 주는 횟수의 합을 최소화하려고 한다. 예를 들어, X = 10, Y = 10이라고 하자.

씨앗에 햇빛을 10번 주면 온기 10, 수분 0이 된다. 그리고, 물을 10번 주면 온기 9. 수분 10이 된다. 마지막으로 햇빛을 1번 주면 온기 10, 수분 10으로 당근이 자라게 된다. 이때, 햇빛과 물을 준 횟수의 합은 21이고 위 예제에서의 최솟값이다.

X와 Y가 주어졌을 때, 당근이 자랄 때까지 햇빛과 물을 주는 횟수의 합의 최솟값을 구하는 프로그램을 작성하라.

입력

첫째 줄에 X와 Y (0 ≤ X, Y ≤ 10^9)를 의미하는 정수가 공백으로 구분되어 주어진다.

출력

당근이 자랄 때까지 햇빛과 물을 주는 횟수의 합의 최솟값을 나타내는 정수를 출력하라.

예제 입력 1

10 10

예제 출력 1

21

예제 입력 2

123456 12345

예제 출력 2

137035

더보기

Solution

#include<stdio.h>

int main(void)
{
	int X, Y;

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

	if(X<Y)
	{
		int temp=X;
		X=Y;
		Y=temp;
	}

	printf("%d\n", X+Y/10+Y);
	return 0;
}
728x90

문제

올해 인천대에서는 코로나19로 인해 온라인 축제를 개최했다. 축제 내용 중에는 퀴즈쇼가 있는데, 초청 연예인이 채팅을 보고 정답을 맞힌 사람의 닉네임을 읽어 1명에게 상품을 주는 이벤트이다.

축제를 즐기던 철이는 퀴즈쇼가 끝난 뒤 커뮤니티에 당첨자보다 정답을 빨리 쳤다며 아쉬워하는 사람들이 나타난 것을 보았다. 채팅 기록을 갖고 있는 철이는 그런 아쉬운 사람들이 몇 명이나 있는지 알고 싶어졌다. 채팅 기록은 여러 줄로 이루어져 있는데, 각 줄에는 채팅을 친 사람의 닉네임과 채팅 내용이 담겨있다.

채팅 기록과 당첨자가 주어졌을 때 아쉬운 사람의 수를 구해보자. 아쉬운 사람은 당첨자보다 빨리 정답을 외친 사람이다.

입력

첫 번째 줄에 채팅 개수 N과 정답자의 닉네임 S가 공백으로 구분되어 주어진다. (2 ≤ N ≤ 1,000)

두 번째 줄부터 차례로 N개의 채팅 기록이 시간순으로 주어진다. 채팅 기록은 닉네임과 채팅 내용이 공백으로 구분되어 주어진다. 각 닉네임과 채팅 내용은 길이가 1이상 10이하이며 알파벳 소문자로만 이루어져 있다.

한 사람이 두 번 이상 채팅을 친 경우는 주어지지 않으며, 정답자의 닉네임 S는 반드시 채팅 기록에 등장한다.

출력

첫 번째 줄에 아쉬운 사람의 명수를 출력한다.

예제 입력 1

3 duck
oridya hello
orihehe hi
duck hi

예제 출력 1

1

예제 입력 2

8 orihehe
orihehe duck
skynet duck
rdd duck
vega duck
reversing duck
dongbin duck
kimyh duck
hunni duck

예제 출력 2

0

실제로는 아쉬운 사람이 없을 수도 있다.

예제 입력 3

8 orihehe
hunni duck
skynet duck
rdd duck
vega duck
reversing duck
dongbin duck
kimyh duck
orihehe duck

예제 출력 3

7

예제 입력 4

8 orihehe
hunni dduck
skynet dduck
rdd dduck
vega dduck
reversing dduck
dongbin dduck
kimyh dduck
orihehe duck

예제 출력 4

0

더보기

Solution

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

int main(void)
{
	int N, count=0, correct;
	char ans[11]={'\0', }, S[11]={'\0', }, **chat=NULL, name[11]={'\0', };

	scanf("%d %s", &N, S);
	chat=(char **)malloc(N*sizeof(char *));
	for(int n=0;n<N;n++)
		chat[n]=(char *)calloc(11,sizeof(char));

	for(int n=0;n<N;n++)
	{
		scanf("%s %s", name, chat[n]);

		if(strcmp(S,name)==0)
		{
			correct=n;
			strcpy(ans,chat[n]);
			break;
		}
	}

	for(int n=0;n<correct;n++)
		count+=strcmp(ans,chat[n])==0;

	printf("%d\n", count);
	for(int n=0;n<N;n++)
		free(chat[n]);
	free(chat);
	return 0;
}
728x90

문제

전설의 야바위꾼 일우는 Shell Game으로 야바위를 한다. Shell Game은 다음과 같은 절차로 진행된다.

  1. 진행자가 N개의 컵을 일렬로 놓고, 그 중 X번째 컵에 공을 숨겨둔다.
  2. 임의의 서로 다른 두 컵의 위치를 맞바꾼다. 이 항목을 K번 수행한다. 만약, 공을 숨겨둔 컵을 움직인다면 공도 그 컵을 따라서 움직인다.
  3. 참가자는 몇 번째 컵에 공이 숨겨져 있는지 추측한다.
  4. 그 컵에 공이 숨겨져 있다면 참가자가, 그렇지 않다면 진행자가 이긴다.

수혁이는 Shell Game을 잘하고 싶다. 하지만, 일우가 진행자라면 무슨 수를 써도 이길 수 없어 수혁이는 일우의 사기도박을 의심하고 있다. 현재 우리는 수혁과 일우가 진행한 Shell Game의 모든 기록을 입수했다. 이를 바탕으로, 일우가 사기도박을 하지 않았다면 공이 몇 번째 컵에 있는지 알려주는 프로그램을 작성하자.

입력

첫째 줄에 N (3 ≤ N ≤ 200,000), X (1 ≤ X  N), K (1 ≤ K ≤ 100,000)가 공백으로 구분되어 주어진다.

둘째 줄부터 K개의 줄에는 순서대로 바꾼 두 컵의 위치 A(i), B(i) (1 ≤ A(i), B(i)  N, A(i)  B(i))가 공백으로 구분되어 주어진다.

주어지는 모든 입력은 정수다.

출력

일우가 사기도박을 하지 않았다면, 공이 몇 번째 위치의 컵에 있어야 하는지 정수로 출력하시오.

예제 입력 1

3 2 4
1 3
3 2
3 1
2 3

예제 출력 1

1

2번째 맞바꿈에서 공은 3번째 위치로 가게 된다.

3번째 맞바꿈에서 공은 1번째 위치로 가게 된다.


더보기

Solution

#include<stdio.h>

int main(void)
{
	int N, X, K, A, B;

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

	for(int i=0;i<K;i++)
	{
		scanf("%d %d", &A, &B);

		if(A==X)
			X=B;
		else if(B==X)
			X=A;
	}

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

문제

흑석동은 최근 뉴타운 공사로 인하여 지나가면 안되는 위험 지역이 존재한다. 이 지역은 X축, Y축과 평행한 직사각형 형태로 이루어져 있다.

중앙대의 마스코트인 푸앙이는 직선 상의 경로를 따라서 흑석동을 통과하고 있다. 이 때 흑석동의 망령 호민이는 푸앙이가 위험지역에 지나갈 것 같다는 생각이 들었다. 따라서 푸앙이가 위험 지역을 지나가는지 여부를 알아내어서 푸앙이가 해당 지역을 지나가지 못하도록 조치를 취할 예정이다.

호민이를 위해 푸앙이가 위험 지역을 지나는 지 알려주는 프로그램을 작성해보자.

입력

첫째 줄에는 정수 A, B, C (-10,000 ≤ A, B ≤ 10,000, -100,000 ≤ C ≤ 100,000)가 주어진다. 해당 숫자들은 좌표 평면 상에서 Ax+By+C=0 형태로 표현되는 푸앙이가 지나가는 직선 상의 경로을 나타낸다. (단 A, B 모두가 0인 경우는 직선의 방정식이 아니므로 주어지지 않는다.)

둘째 줄에는 정수 X1, X2, Y1, Y2 (-100,000 ≤ X1 < X2 ≤ 100,000, -100,000 ≤ Y1 < Y2 ≤ 100,000) 이 주어진다. 직사각형의 테두리들은 x = X1, x = X2, y = Y1, y = Y2 에 해당하는 직선에 포함된다.

출력

첫째 줄에 푸앙이가 위험지역을 통과하면 “Poor”를, 통과하지 않으면 “Lucky”을 출력하라. 위험 지역의 모서리만 통과하거나, 테두리 위로만 지나가는 경우는 위험지역을 통과하지 않는 것으로 간주한다.

예제 입력 1

3 4 5
-1 0 -1 0

예제 출력 1

Poor

예제 1에 주어진 수들을 그래프로 그리면 다음과 같다.

예제 입력 2

1 1 -2
-1 1 -1 1

예제 출력 2

Lucky

예제 2에 주어진 수들을 그래프로 그리면 다음과 같다.

모서리를 통과하지만 위험지역을 통과하지 않는 것으로 간주하므로 Lucky를 출력한다.

 


더보기

Solution

#include<stdio.h>

int main(void)
{
	long int A, B, C, X1, X2, Y1, Y2;

	scanf("%ld %ld %ld", &A, &B, &C);
	scanf("%ld %ld %ld %ld", &X1, &X2, &Y1, &Y2);

	if(A==0)
		printf("%s\n", (B*Y1+C)*(B*Y2+C)<0?"Poor":"Lucky");
	else if(B==0)
		printf("%s\n", (A*X1+C)*(A*X2+C)<0?"Poor":"Lucky");
	else if(A*B<0)
		printf("%s\n", (A*X1+B*Y2+C)*(A*X2+B*Y1+C)<0?"Poor":"Lucky");
	else
		printf("%s\n", (A*X1+B*Y1+C)*(A*X2+B*Y2+C)<0?"Poor":"Lucky");
	return 0;
}
728x90

문제

로니 콜먼 동영상을 보고 보디빌더가 되기로 결심한 향빈이는 PT 상담을 받으러 서강헬스클럽에 갔다. 향빈이가 서강헬스클럽을 선택한 이유는 PT를 받을 때 사용하는 운동기구를 회원이 선택할 수 있다는 점 때문이다. 하지만, 서강헬스클럽은 항상 사람이 많아서 PT를 한 번 받을 때 운동기구를 최대 두 개까지만 선택할 수 있다.

헬스장에 있는 N개의 운동기구를 한 번씩 사용해보고 싶은 향빈이는 PT를 받을 때마다 이전에 사용하지 않았던 운동기구를 선택하기로 계획을 세웠다. 그리고 비용을 절약하기 위해 PT를 받을 때 운동기구를 되도록이면 두 개를 사용하기로 했다. 예를 들어, 헬스장에 총 10개의 운동기구가 있을 경우 PT를 5번 받으면 모든 기구를 다 사용할 수 있다. 9개의 운동기구가 있는 경우에도 PT를 5번 받지만, 마지막 PT를 받을 때는 운동기구를 하나만 사용한다.

하지만 향빈이는 운동기구를 선택하다가 큰 고민에 빠졌다. 왜냐하면 운동기구마다 근손실이 일어나는 정도가 다르기 때문이다. 어떤 운동기구는 자극이 잘 안 와서 근손실이 적게 일어나는데, 어떤 운동기구는 자극이 잘 와서 근손실이 많이 일어난다. 근손실이 죽음보다 무서운 향빈이는 PT를 한 번 받을 때의 근손실 정도가 M을 넘지 않도록 하고 싶다. 이때, M의 최솟값을 구해보자. 참고로, 운동기구를 두 개 사용해서 PT를 받을 때의 근손실 정도는 두 운동기구의 근손실 정도의 합이다.

입력

첫째 줄에 서강헬스클럽에 비치된 운동기구의 개수를 나타내는 정수 N이 주어진다. (1≤N≤10000)

둘째 줄에는 각 운동기구의 근손실 정도를 나타내는 정수 t(1),t(2),⋯,t(N)가 주어진다. (0≤t(i)≤10^18)

출력

M의 최솟값을 출력한다.

예제 입력 1

5
1 2 3 4 5

예제 출력 1

5

PT 첫째 날에 1 4를 선택하고, 둘째 날에 2 3을 선택하고, 마지막 날에 5를 선택하면 M 5가 되며, 이때가 M이 최소일 때이다.


더보기

Solution

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

int compare(const void *x,const void *y)
{
	return *(unsigned long long int *)x>*(unsigned long long int *)y?1:*(unsigned long long int *)x==*(unsigned long long int *)y?0:-1;
}

int main(void)
{
	int N;
	unsigned long long int *t=NULL, M=0;

	scanf("%d", &N);
	t=(unsigned long long int *)malloc(N*sizeof(unsigned long long int));
	for(int i=0;i<N;i++)
		scanf("%llu", &t[i]);

	qsort((void *)t,(size_t)N,sizeof(unsigned long long int),compare);

	if(N%2==1)
	{
		M=t[N-1];

		for(int i=0;i<N/2;i++)
			M=t[i]+t[N-i-2]>M?t[i]+t[N-i-2]:M;
	}
	else
		for(int i=0;i<N/2;i++)
			M=t[i]+t[N-i-1]>M?t[i]+t[N-i-1]:M;

	printf("%llu\n", M);
	free(t);
	return 0;
}
728x90

+ Recent posts