문제

당신은 FCFS(First-Come, First-Served)의 규칙에 따라 요청된 일을 처리하는 서버를 담당하게 되었다. 매일, 당신은 일을 처리하기 위해 최대 T분 동안 서버에 시간을 할당할 수 있다. 당신은 오늘 주어진 시간동안 몇개의 일이 완료될 수 있는지 알고싶다.

예시를 들어보겠다. T = 180이고, 요청된 일들의 수행시간이 요청된 순으로 각각 45, 30, 55, 20, 80, 20분이다. 그러면, 단 4개의 일만이 완료될 수 있다. 처음 4개의 일의 수행시간은 150분으로 주어진 시간 내에 완료될 수 있지만, 처음 5개의 일의 수행시간은 230분으로 주어진 시간 180분보다 크기 때문에 완료될 수 없다. 처음 4개의 일을 수행한 뒤 6번째의 일을 수행해도 T를 초과하지 않지만 5번째 일을 수행할 수 없기 때문에 6번째 일을 수행할 수 없음을 참고해라.

입력

첫 줄은 두 정수 n과 T이며 (1 ≤ n ≤ 50, 1 ≤ T ≤ 500) n은 일의 개수를 나타낸다. 두 번째 줄은 n개의 100 이하인 자연수가 입력되며, 입력된 각 일의 수행 시간을 나타낸다.

출력

일이 First-come, First-served 규칙에 따라 처리될 때, T분 안에 완료될 수 있는 일들의 개수를 출력하라.

예제 입력 1

6 180
45 30 55 20 80 20

예제 출력 1

4

예제 입력 2

10 60
20 7 10 8 10 27 2 3 10 5

예제 출력 2

5

더보기

Solution

#include<stdio.h>

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

	scanf("%d %d", &n, &T);

	for(count=0;count<n;count++)
	{
		scanf("%d", &work);
		sum+=work;
		if(sum>T)
			break;
	}

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

문제

대열이는 욱제의 친구다.

  • “야 백대열을 약분하면 뭔지 알아?”
  • “??”
  • “십대일이야~ 하하!”

n:m이 주어진다. 욱제를 도와주자. (...)

입력

n과 m이 :을 사이에 두고 주어진다. (1 <= n, m <= 100,000,000)

출력

두 수를 최대한으로 약분하여 출력한다.

예제 입력 1

100:10

예제 출력 1

10:1

예제 입력 2

18:24

예제 출력 2

3:4

더보기

Solution

#include<stdio.h>

int gcd(int x,int y)
{
	if(x<y)
	{
		int temp=x;
		x=y;
		y=temp;
	}

	while(y!=0)
	{
		int temp=x%y;
		x=y;
		y=temp;
	}

	return x;
}

int main(void)
{
	int n, m, gcd_nm;

	scanf("%d:%d", &n, &m);

	gcd_nm=gcd(n,m);
	n/=gcd_nm;
	m/=gcd_nm;

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

문제

“나는 행복합니다~ 한화라서 행복합니다~”

행복한 이 노래 가사! 그렇다. 욱제는 한화 이글스의 열렬한 팬이다. 욱제는 여름방학을 맞아 치킨과 맥주를 챙겨 야구장을 방문했다! 하지만 이게 웬걸? 치맥에 정신이 팔린 욱제는 그만 자신의 관중석 위치가 담긴 티켓을 잃어버리고 말았다. 욱제가 유일하게 기억하는 것이라고는 자신의 관중석 번호 K뿐이다.

당신은 한화 이글스의 감독이다. 열혈팬인 욱제의 방문에 깊은 감동을 받은 당신은 욱제가 잃어버린 자리를 찾아주려고 한다. 오늘 경기가 펼쳐지는 잠실구장은 세로 길이가 N, 가로 길이가 M인 N*M 크기의 관중석을 가지고 있다. 관중석의 왼쪽 위는 (0, 0), 오른쪽 아래는 (N-1, M-1)으로 표시된다. 각 관중석에는 번호가 아래 그림처럼 매겨져있다. (0, 0)에서부터 0번으로 시작하여 오른쪽으로, 끝에 다다르면 그 아래에서 또 오른쪽으로 숫자가 증가해나가는 식이다.

당신은 관중석의 크기와 욱제 자리의 번호를 알고 있다. 욱제가 잃어버린 자리는 어디일까? 자리를 찾아서 욱제에게 알려주도록 하자!

입력

첫째 줄에 관중석의 크기를 나타내는 N, M과 잃어버린 관중석 번호를 나타내는 K가 주어진다. (1 <= N, M <= 30,000, 0 <= K <= N*M-1)

출력

욱제의 잃어버린 자리를 찾아서, 잃어버린 자리의 좌표 (n, m)를 하나의 공백을 사이에 두고 숫자만 출력한다.

예제 입력 1

3 4 6

예제 출력 1

1 2

예제 입력 2

6 4 14

예제 출력 2

3 2

더보기

Solution

#include<stdio.h>

int main(void)
{
	int N, M, K;

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

	printf("%d %d\n", K/M, K%M);
	return 0;
}
728x90

문제

영식이와 친구들이 원형으로 모여서 시계방향으로 1부터 N까지 적혀있는 자리에 앉는다. 영식이와 친구들은 공 던지는 게임을 하기로 했다. 게임의 규칙은 다음과 같다.

일단 1번 자리에 앉은 사람이 공을 받는다. 그리고 나서 공을 다른 사람에게 던진다. 다시 공을 받은 사람은 다시 공을 던지고, 이를 계속 반복한다. 한 사람이 공을 M번 받았으면 게임은 끝난다. (지금 받은 공도 포함하여 센다.) 공을 M번보다 적게 받은 사람이 공을 던질 때, 현재 공을 받은 횟수가 홀수번이면 자기의 현재 위치에서 시계 방향으로 L번째 있는 사람에게, 짝수번이면 자기의 현재 위치에서 반시계 방향으로 L번째 있는 사람에게 공을 던진다.

공을 총 몇 번 던지는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N, M, L이 입력으로 들어온다. N은 3보다 크거나 같고, 1,000보다 작거나 같은 자연수이고, M은 1,000보다 작거나 같은 자연수이다. L은 N-1보다 작거나 같은 자연수이다.

출력

첫째 줄에 공을 몇 번 던지는지 횟수를 출력한다.

예제 입력 1

5 3 2

예제 출력 1

10

힌트

일단 1번이 공을 잡는다. 1번은 공을 한 번 잡았기 때문에, 공을 3번에게 던진다. 3번은 공을 한 번 잡았기 때문에, 공을 5번에게 던진다. 5번은 2번에게 던지고, 2번은 4번에게 던진다. 4번은 1번에게 던진다. 1번은 이제 공을 두 번 잡았기 때문에, 공을 4번에게 던진다. 4번은 2번에게 던지고, 2번은 5번에게 던지고, 5번은 3번에게 던지고, 마지막으로 3번은 1번에게 던진다. 1번은 이제 공을 세 번 잡았기 때문에, 게임은 끝난다.


더보기

Solution

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

int main(void)
{
	int N, M, L, *ball=NULL, state=0, count=0;

	scanf("%d %d %d", &N, &M, &L);
	ball=(int *)calloc(N,sizeof(int));

	ball[0]=1;
	while(ball[state]<M)
	{
		count++;

		state+=ball[state]%2==0?-L:L;
		if(state<0)
			state+=N;
		else if(state>=N)
			state-=N;

		ball[state]++;
	}

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

문제

학생들은 3주가 지난 기념으로 매점에서 1월 1일이 지나 싸게 파는 폭죽을 사서 터뜨리고 있다.

폭죽쇼를 하는 동안 N명의 학생들이 폭죽을 터뜨린다. 그리고 이 N명의 학생은 각각 일정한 주기로 폭죽을 터뜨린다. 물론 이 주기는 학생들마다 같을 수도, 다를 수도 있다. 그리고 우리는 초 단위로 관찰을 하고, 폭죽 역시 초 단위로 터진다.

폭죽쇼가 끝날 때까지 얼마나 많은 시간동안 밤하늘에 폭죽이 터지는 것을 볼 수 있는지 궁금해 하는 조교를 도와주자.

입력

첫 줄에 폭죽을 터뜨리는 학생의 수 N(1 ≤ N ≤ 100)과 폭죽쇼가 끝나는 시간 C(1 ≤ C ≤ 2,000,000)가 주어진다. 그 다음 N개의 줄에는 학생들이 폭죽을 터뜨리는 주기가 한 줄에 하나씩 주어진다. 주기는 1보다 크거나 같고, C보다 작거나 같은 자연수이다.

출력

폭죽쇼가 시작되고 끝날 때까지 밤하늘에 폭죽을 볼 수 있는 총 시간을 출력한다.

예제 입력 1

2 20
4
6

예제 출력 1

7

힌트

                                                 2                       
                1       2      1                1                1       2       1
0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
                1       2      3              4                5       6       7 

위의 그림에서 1,2가 쓰여있는 4, 6, 8, 12, 16, 18, 20초에 폭죽이 밤 하늘에 터진다. 단 12초에는 두 폭죽이 동시에 하늘에 터지지만 한번으로 세는 것에 주의하자.


더보기

Solution

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

int main(void)
{
	int N, C, *period=NULL, exploded=0;

	scanf("%d %d", &N, &C);
	period=(int *)malloc(N*sizeof(int));
	for(int i=0;i<N;i++)
		scanf("%d", &period[i]);

	for(int c=1;c<=C;c++)
		for(int i=0;i<N;i++)
			if(c%period[i]==0)
			{
				exploded++;
				break;
			}

	printf("%d\n", exploded);
	free(period);
	return 0;
}
728x90

문제

상근이는 기숙사 생활을 한다. 상근이의 방의 크기는 L*W 이다.

수업시간에 타일 채우기 경우의 수를 계산하던 상근이는 자신의 방도 1*1크기 타일로 채우려고 한다. 이때, 가장자리는 빨간색으로, 나머지는 갈색으로 채우려고 한다.

아래 그림은 상근이의 방의 크기가 4*3일 때 이다.

어느 날 상근이네 방에 하근이가 놀러왔다. 하근이는 아름다운 타일 배치에 감동받았다. 다시 방으로 돌아온 하근이는 빨간색과 갈색 타일의 개수는 기억했지만, 방의 크기는 기억해내지 못했다.

빨간색과 갈색 타일의 개수가 주어졌을 때, 상근이 방의 크기를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 빨간색 타일의 수 R과 갈색 타일의 수 B가 주어진다. (8 ≤ R ≤ 5000, 1 ≤ B ≤ 2,000,000)

출력

첫째 줄에 상근이네 방의 크기 L과 W을 공백으로 구분하여 출력한다. 만약, 두 수가 다르다면, 큰 수가 L이 되고 작은 수가 W이 된다. 항상 정답이 유일한 경우만 입력으로 주어진다.

예제 입력 1

10 2

예제 출력 1

4 3

더보기

Solution

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

int main(void)
{
	int L, W, R, B;

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

	for(L=1;;L++)
	{
		bool solved=false;

		for(W=1;W<=L && L*W<=R+B;W++)
			if(2*(L+W-2)==R && L*W-R==B)
			{
				solved=true;
				break;
			}

		if(solved)
			break;
	}

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

문제

수 124를 뒤집으면 421이 되고 이 두 수를 합하면 545가 된다. 124와 같이 원래 수와 뒤집은 수를 합한 수가 좌우 대칭이 되는지 테스트 하는 프로그램을 작성하시오.

입력

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄에 하나의 정수 N(10 ≤ N ≤ 100000)이 주어진다.

출력

각 테스트 케이스에 대해서 원래 수와 뒤집은 수를 합한 수가 좌우 대칭이 되면 YES를 아니면 NO를 한 줄에 하나씩 출력한다.

예제 입력 1

4
13
58
120
5056

예제 출력 1

YES
NO
YES
NO

더보기

Solution

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

int main(void)
{
	int T;

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		bool palindrome=true;
		int N1, N2=0, temp;
		char str[10]={'\0', };

		scanf("%d", &N1);
		temp=N1;

		while(temp>0)
		{
			N2*=10;
			N2+=temp%10;
			temp/=10;
		}

		N1+=N2;
		sprintf(str,"%d",N1);

		for(int i=0;i<strlen(str)/2;i++)
			if(str[i]!=str[strlen(str)-1-i])
			{
				palindrome=false;
				break;
			}

		printf("%s\n", palindrome?"YES":"NO");
	}

	return 0;
}
728x90

문제

미국으로 유학간 동혁이는 세탁소를 운영하고 있다. 동혁이는 최근에 아르바이트로 고등학생 리암을 채용했다.

동혁이는 리암에게 실망했다.

리암은 거스름돈을 주는 것을 자꾸 실수한다.

심지어 $0.5달러를 줘야하는 경우에 거스름돈으로 $5달러를 주는것이다!

어쩔수 없이 뛰어난 코딩 실력을 발휘해 리암을 도와주는 프로그램을 작성하려고 하지만, 디아블로를 하느라 코딩할 시간이 없어서 이 문제를 읽고 있는 여러분이 대신 해주어야 한다.

거스름돈의 액수가 주어지면 리암이 줘야할 쿼터(Quarter, $0.25)의 개수, 다임(Dime, $0.10)의 개수, 니켈(Nickel, $0.05)의 개수, 페니(Penny, $0.01)의 개수를 구하는 프로그램을 작성하시오. 거스름돈은 항상 $5.00 이하이고, 손님이 받는 동전의 개수를 최소로 하려고 한다. 예를 들어, $1.24를 거슬러 주어야 한다면, 손님은 4쿼터, 2다임, 0니켈, 4페니를 받게 된다.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 거스름돈 C를 나타내는 정수 하나로 이루어져 있다. C의 단위는 센트이다. (1달러 = 100센트) (1<=C<=500)

출력

각 테스트케이스에 대해 필요한 쿼터의 개수, 다임의 개수, 니켈의 개수, 페니의 개수를 공백으로 구분하여 출력한다.

예제 입력 1

3
124
25
194

예제 출력 1

4 2 0 4
1 0 0 0
7 1 1 4

힌트


더보기

Solution

#include<stdio.h>

int main(void)
{
	int T, C, change[4]={25,10,5,1};

	scanf("%d", &T);

	for(int t=0;t<T;t++)
	{
		scanf("%d", &C);

		for(int i=0;i<4;i++)
		{
			printf("%d ", C/change[i]);
			C%=change[i];
		}
		printf("\n");
	}

	return 0;
}
728x90

+ Recent posts