문제

윤진이는 이번에 카우버거 알바생으로 뽑히게 되었다. 그녀는 카우버거를 평소에 이용하면서 들었던 의문점 한가지가 있었다.

"카우버거에는 왜 세트 메뉴에 대한 할인이 존재하지 않는가?"

따라서 윤진이의 아이디어로 카우버거에 세트 할인을 도입하고자 한다. 세트 메뉴는 버거 1개, 사이드 메뉴 1개, 음료 1개를 선택 할 경우 각각의 제품에 대해서 10%의 세트 할인을 적용하는 방식으로 진행된다.

하지만 카우버거 점주는 POS기의 소프트웨어가 오래되어 세트 할인에 대한 내용을 추가할 수가 없었다. 따라서 소프트웨어학부에 재학 중인 윤진이는 전공을 살려 직접 프로그램을 만들어보려고 한다. 윤진이를 도와 POS기에 들어갈 세트 할인에 대한 프로그램을 작성해보자.

입력

첫째 줄에는 주문한 버거의 개수 B, 사이드 메뉴의 개수 C, 음료의 개수 D가 공백을 사이에 두고 순서대로 주어진다. (1 ≤ B, C, D ≤ 1,000)

둘째 줄에는 각 버거의 가격이 공백을 사이에 두고 주어진다.

셋째 줄에는 각 사이드 메뉴의 가격이 공백을 사이에 두고 주어진다.

넷째 줄에는 각 음료의 가격이 공백을 사이에 두고 주어진다.

각 메뉴의 가격은 100의 배수이며, 10000원을 넘지 않는다.

 

출력

첫째 줄에는 세트 할인이 적용되기 전 가격을 출력한다.

둘째 줄에는 세트 할인이 적용된 후의 최소 가격을 출력한다.

예제 입력 1

3 3 2
2000 3000 2500
800 1300 1000
500 1000

예제 출력 1

12100
11170

힌트

입력 예에 나온 메뉴들의 가격을 모두 합하면 12100원이다.

첫 번째 세트는 3000원짜리 버거, 1300원짜리 사이드메뉴, 1000원짜리 음료로 구성하면 5300 * 0.9 = 4770원이다.

두 번째 세트는 2500원짜리 버거, 1000원짜리 사이드메뉴, 500원짜리 음료로 구성하면 4000 * 0.9 = 3600원이다.

남은 2000원짜리 버거와 800원짜리 사이드메뉴는 음료가 없으므로 세트 할인을 받을 수 없다. 따라서 세트 할인이 적용된 후의 최소 가격은 4770+3600+2800 = 11170원이 된다.


더보기

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 b, c, d, *B=NULL, *C=NULL, *D=NULL, before=0, after=0, min;

	scanf("%d %d %d", &b, &c, &d);
	B=(int *)malloc(b*sizeof(int));
	C=(int *)malloc(c*sizeof(int));
	D=(int *)malloc(d*sizeof(int));

	min=b<=c&&b<=d?b:c<=b&&c<=d?c:d;

	for(int i=0;i<b;i++)
	{
		scanf("%d", &B[i]);
		before+=B[i];
	}
	for(int i=0;i<c;i++)
	{
		scanf("%d", &C[i]);
		before+=C[i];
	}
	for(int i=0;i<d;i++)
	{
		scanf("%d", &D[i]);
		before+=D[i];
	}

	qsort((void *)B,(size_t)b,sizeof(int),compare);
	qsort((void *)C,(size_t)c,sizeof(int),compare);
	qsort((void *)D,(size_t)d,sizeof(int),compare);

	for(int i=0;i<b;i++)
		after+=i<min?(9*B[b-i-1])/10:B[b-i-1];
	for(int i=0;i<c;i++)
		after+=i<min?(9*C[c-i-1])/10:C[c-i-1];
	for(int i=0;i<d;i++)
		after+=i<min?(9*D[d-i-1])/10:D[d-i-1];

	printf("%d\n%d\n", before, after);
	free(B);
	free(C);
	free(D);
	return 0;
}
728x90

문제

천수는 여러 종류의 주사위를 가지고 쌓기 놀이를 하고 있다. 주사위의 모양은 모두 크기가 같은 정육면체이며 각 면에는 1부터 6까지의 숫자가 하나씩 적혀있다. 그러나 보통 주사위처럼 마주 보는 면에 적혀진 숫자의 합이 반드시 7이 되는 것은 아니다.

주사위 쌓기 놀이는 아래에서부터 1번 주사위, 2번 주사위, 3번 주사위, … 의 순서로 쌓는 것이다. 쌓을 때 다음과 같은 규칙을 지켜야 한다: 서로 붙어 있는 두 개의 주사위에서 아래에 있는 주사위의 윗면에 적혀있는 숫자는 위에 있는 주사위의 아랫면에 적혀있는 숫자와 같아야 한다. 다시 말해서, 1번 주사위 윗면의 숫자는 2번 주사위 아랫면의 숫자와 같고, 2번 주사위 윗면의 숫자는 3번 주사위 아랫면의 숫자와 같아야 한다. 단, 1번 주사위는 마음대로 놓을 수 있다.

이렇게 쌓아 놓으면 긴 사각 기둥이 된다. 이 사각 기둥에는 4개의 긴 옆면이 있다. 이 4개의 옆면 중에서 어느 한 면의 숫자의 합이 최대가 되도록 주사위를 쌓고자 한다. 이렇게 하기 위하여 각 주사위를 위 아래를 고정한 채 옆으로 90도, 180도, 또는 270도 돌릴 수 있다. 한 옆면의 숫자의 합의 최댓값을 구하는 프로그램을 작성하시오.

입력

첫줄에는 주사위의 개수가 입력된다. 그 다음 줄부터는 한 줄에 하나씩 주사위의 종류가 1번 주사위부터 주사위 번호 순서대로 입력된다. 주사위의 종류는 각 면에 적혀진 숫자가 그림1에 있는 주사위의 전개도에서 A, B, C, D, E, F 의 순서로 입력된다. 입력되는 숫자 사이에는 빈 칸이 하나씩 있다. 주사위의 개수는 10,000개 이하이며 종류가 같은 주사위도 있을 수 있다.

출력

첫줄에 한 옆면의 숫자의 합이 가장 큰 값을 출력한다.

예제 입력 1

5
2 3 1 6 5 4
3 1 2 4 6 5
5 6 4 1 3 2
1 3 6 2 4 5
4 1 6 5 2 3

예제 출력 1

29

더보기

Solution

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

int main(void)
{
	int N, dice[6], **order=NULL, max=0;

	scanf("%d", &N);
	order=(int **)malloc(N*sizeof(int *));
	for(int n=0;n<N;n++)
		order[n]=(int *)calloc(6,sizeof(int));

	for(int n=0;n<N;n++)
	{
		for(int i=0;i<6;i++)
			scanf("%d", &dice[i]);

		order[n][dice[0]-1]=dice[5]-1;
		order[n][dice[1]-1]=dice[3]-1;
		order[n][dice[2]-1]=dice[4]-1;
		order[n][dice[3]-1]=dice[1]-1;
		order[n][dice[4]-1]=dice[2]-1;
		order[n][dice[5]-1]=dice[0]-1;
	}

	for(int state=0;state<6;state++)
	{
		int sum=0, current=state;

		for(int n=0;n<N;n++)
		{
			if(order[n][current]==5)
				sum+=current==4?4:5;
			else if(order[n][current]==4)
				sum+=current==5?4:6;
			else
				sum+=current==5?5:6;

			current=order[n][current];
		}

		max=sum>max?sum:max;
	}

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

문제

n×m의 0, 1로 된 배열이 있다. 이 배열에서 1로 된 가장 큰 정사각형의 크기를 구하는 프로그램을 작성하시오.

0 1 0 0
0 1 1 1
1 1 1 0
0 0 1 0

위와 같은 예제에서는 가운데의 2×2 배열이 가장 큰 정사각형이다. 

입력

첫째 줄에 n, m(1 ≤ n, m ≤ 1,000)이 주어진다. 다음 n개의 줄에는 m개의 숫자로 배열이 주어진다.

출력

첫째 줄에 가장 큰 정사각형의 넓이를 출력한다.

예제 입력 1

4 4
0100
0111
1110
0010

예제 출력 1

4

더보기

Solution

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

int min(int x,int y,int z)
{
	return x<=y&&x<=z?x:y<=x&&y<=z?y:z;
}

int main(void)
{
	int n, m, **board=NULL, max=0;

	scanf("%d %d", &n, &m);
	board=(int **)malloc((n+1)*sizeof(int *));
	for(int i=0;i<=n;i++)
		board[i]=(int *)calloc(m+1,sizeof(int));

	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			scanf("%1d", &board[i][j]);

			if(board[i][j]==1)
				board[i][j]=min(board[i-1][j-1],board[i-1][j],board[i][j-1])+1;

			max=board[i][j]>max?board[i][j]:max;
		}

	printf("%d\n", max*max);
	for(int i=0;i<=n;i++)
		free(board[i]);
	free(board);
	return 0;
}
728x90

문제

졸업을 앞둔 연길이는 크리스마스가 다가올수록 외로움을 느낀다.

그런 연길이를 위해 동우는 소개팅을 시켜주지는 않고 연길이의 이상향을 찾는 것을 도와주고자 한다.

MBTI 신봉자인 연길이는 자신과 정반대인 사람에게 매력을 느낀다. 즉, MBTI의 네가지 지표가 모두 자신과 반대인 사람이 연길이의 이상형이다.

MBTI는 다음과 같은 네 가지 척도로 성격을 표시한다. 각각의 척도는 두 가지 극이 되는 성격으로 이루어져 있다.

지표 설명
외향(Extroversion) 내향(Introversion) 선호하는 세계:세상과 타인 / 내면 세계
감각(Sensation) 직관(iNtuition) 인식형태: 실제적인 인식/ 실제 너머로 인식
사고(Thinking) 감정(Feeling) 판단기준: 사실과 진실 위주 / 관계와 사람 위주
판단(Judging) 인식(Perceiving) 생활양식: 계획적인 생활 / 즉흥적인 생활

네 가지 척도마다 두 가지 경우가 존재하므로, 총 16가지의 유형이 만들어진다. 유형은 각 경우를 나타내는 알파벳 한 글자씩을 따서 네 글자로 표시한다. 다음은 MBTI의 유형들이다.

구분 감각/사고 감각/감정 직관/감정 직관/사고
내향/판단 ISTJ ISFJ INFJ INTJ
내향/인식 ISTP ISFP INFP INTP
외향/인식 ESTP ESFP ENFP ENTP
외향/판단 ESTJ ESFJ ENFJ ENTJ

연길이가 자신의 이상향을 무사히 찾을 수 있도록 도와주자!

입력

연길이의 MBTI 4글자가 대문자로 주어진다.

출력

연길이의 이상형에 해당하는 MBTI 4글자를  대문자로 출력한다.

예제 입력 1

ESTJ

예제 출력 1

INFP

예제 입력 2

INFP

예제 출력 2

ESTJ

힌트

MBTI는  Myers-Briggs Type Indicator의 줄임말이다.


더보기

Solution

#include<stdio.h>

int main(void)
{
	char MBTI[5]={'\0', };

	scanf("%s", MBTI);

	MBTI[0]=MBTI[0]=='E'?'I':'E';
	MBTI[1]=MBTI[1]=='S'?'N':'S';
	MBTI[2]=MBTI[2]=='F'?'T':'F';
	MBTI[3]=MBTI[3]=='P'?'J':'P';

	printf("%s\n", MBTI);
	return 0;
}
728x90

문제

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.

N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (1 ≤ N < 15)

출력

첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.

예제 입력 1

8

예제 출력 1

92

더보기

Solution

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

int abs(int N)
{
	return N<0?-N:N;
}

int queen(int *board,int current,int N)
{
	int count=0, *temp=calloc(N,sizeof(int));

	if(current==N)
	{
		free(temp);
		return 1;
	}

	for(int i=0;i<current;i++)
		temp[i]=board[i];

	for(int n=0;n<N;n++)
	{
		bool flag=true;

		for(int i=0;i<current;i++)
			if(board[i]==n || current-i==abs(n-board[i]))
			{
				flag=false;
				break;
			}

		if(flag)
		{
			temp[current]=n;
			count+=queen(temp,current+1,N);
		}
	}

	free(temp);
	return count;
}

int main(void)
{
	int N, *board=NULL;

	scanf("%d", &N);
	board=(int *)calloc(N,sizeof(int));

	printf("%d\n", queen(board,0,N));
	free(board);
	return 0;
}
728x90

문제

요즘 민규네 동네에서는 스타트링크에서 만든 PS카드를 모으는 것이 유행이다.

PS카드는 PS(Problem Solving)분야에서 유명한 사람들의 아이디와 얼굴이 적혀있는 카드이다. 각각의 카드에는 등급을 나타내는 색이 칠해져 있고, 다음과 같이 8가지가 있다.

  • 설카드
  • 레드카드
  • 오렌지카드
  • 퍼플카드
  • 블루카드
  • 청록카드
  • 그린카드
  • 그레이카드

카드는 카드팩의 형태로만 구매할 수 있고, 카드팩의 종류는 카드 1개가 포함된 카드팩, 카드 2개가 포함된 카드팩, ... 카드 N개가 포함된 카드팩과 같이 총 N가지가 존재한다.

민규는 카드의 개수가 적은 팩이더라도 가격이 비싸면 높은 등급의 카드가 많이 들어있을 것이라는 미신을 믿고 있다. 따라서, 민규는 돈을 최대한 많이 지불해서 카드 N개 구매하려고 한다. 카드가 i개 포함된 카드팩의 가격은 Pi원이다.

예를 들어, 카드팩이 총 4가지 종류가 있고, P(1) = 1, P(2) = 5, P(3) = 6, P(4) = 7인 경우에 민규가 카드 4개를 갖기 위해 지불해야 하는 금액의 최댓값은 10원이다. 2개 들어있는 카드팩을 2번 사면 된다.

P(1) = 5, P(2) = 2, P(3) = 8, P(4) = 10인 경우에는 카드가 1개 들어있는 카드팩을 4번 사면 20원이고, 이 경우가 민규가 지불해야 하는 금액의 최댓값이다.

마지막으로, P(1) = 3, P(2) = 5, P(3) = 15, P(4) = 16인 경우에는 3개 들어있는 카드팩과 1개 들어있는 카드팩을 구매해 18원을 지불하는 것이 최댓값이다.

카드 팩의 가격이 주어졌을 때, N개의 카드를 구매하기 위해 민규가 지불해야 하는 금액의 최댓값을 구하는 프로그램을 작성하시오. N개보다 많은 개수의 카드를 산 다음, 나머지 카드를 버려서 N개를 만드는 것은 불가능하다. 즉, 구매한 카드팩에 포함되어 있는 카드 개수의 합은 N과 같아야 한다.

입력

첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000)

둘째 줄에는 P(i)가 P(1)부터 P(N)까지 순서대로 주어진다. (1 ≤ P(i) ≤ 10,000)

출력

첫째 줄에 민규가 카드 N개를 갖기 위해 지불해야 하는 금액의 최댓값을 출력한다.

예제 입력 1

4
1 5 6 7

예제 출력 1

10

예제 입력 2

5
10 9 8 7 6

예제 출력 2

50

예제 입력 3

10
1 1 2 3 5 8 13 21 34 55

예제 출력 3

55

예제 입력 4

10
5 10 11 12 13 30 35 40 45 47

예제 출력 4

50

예제 입력 5

4
5 2 8 10

예제 출력 5

20

예제 입력 6

4
3 5 15 16

예제 출력 6

18

힌트


더보기

Solution

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

int main(void)
{
	int N, *P=NULL;

	scanf("%d", &N);
	P=(int *)calloc(N+1,sizeof(int));

	for(int n=1;n<=N;n++)
	{
		scanf("%d", &P[n]);

		for(int i=1;i<=n/2;i++)
			P[n]=P[n]>P[i]+P[n-i]?P[n]:P[i]+P[n-i];
	}

 	printf("%d\n", P[N]);
 	free(P);
 	return 0;
}
728x90

+ Recent posts