출처 : 반크_반크 20년 백서
문제]
2016/2017 COCI 크로아티아 정보학 공개 경쟁 #2 1번 포켓몬GO
모바일 게임을 즐겨 하는 지우는 Jetpack Joyride 에 금새 질렸고 포켓몬 GO를 시작했다! 이 게임의 재미있는 점은 포켓몬을 진화시킬 수 있다는 것이다.
지우가 Pi 라는 포켓몬을 진화시키기 위해서는 해당 포켓몬의 Ki 개의 사탕이 필요하다. 진화가 된 후에는 2개의 사탕을 돌려받는다.
각 포켓몬은 그들 종의 사탕으로만 진화할 수 있다.
지우는 N종의 포켓몬이 있고 Pi 라는 포켓몬의 사탕은 Mi 개를 가지고 있으며 지우는 진화시킬 수 있는 포켓몬의 총 마리수를 궁금해한다.
또한, 지우는 가장 많이 진화시킬 수 있는 포켓몬이 무엇인지 알고 싶어한다. 만약 그런 포켓몬들이 여러 종이 있다면 도감번호가 가장 작은 포켓몬을 출력한다. 즉, 입력 데이터에서 더 먼저 나타나는 포켓몬을 출력하면 된다.
입력
첫 번째 줄에는 포켓몬의 종류 수를 나타내는 N (1 ≤ N ≤ 70)이 주어진다.
그 다음 2N 줄에는 N개의 데이터 세트가 입력되는데
2i 번째 줄에는 i번째 포켓몬의 이름을 나타내는 최대길이 20의 Pi 문자열이 주어진다.
2i + 1 번째 줄에는 Ki (12 ≤ Ki ≤ 400) , Mi (1 ≤ Mi ≤ 104) 가 주어지는데 각각 i 번째 포켓몬이 진화에 필요한 사탕의 수와 지우가 가지고 있는 i 번째 포켓몬의 총 사탕의 수이다.
출력
첫 번째 줄엔 진화시킬 수 있는 포켓몬의 총 마리수를 출력한다.
두 번째 줄엔 가장 많이 진화시킬 수 있는 포켓몬의 이름을 출력한다.
예제 입력 1
4
Caterpie
12 33
Weedle
12 42
Pidgey
12 47
Rattata
25 71
예제 출력 1
14
Weedle
예제 입력 2
7
Bulbasaur
25 74
Ivysaur
100 83
Charmander
25 116
Charmeleon
100 32
Squirtle
25 1
Wartortle
100 173
Pikachu
50 154
예제 출력 2
11
Charmander
참고풀이1]
#include <stdio.h>
#include <stdlib.h> //malloc(), free()
#include <string.h> //strlen()
struct PokeMon{
char P[21]; //포켓몬 이름
int K; //포켓몬이 진화에 필요한 사탕 수
int M; //게이머가 갖고있는 포켓몬의 사탕 수
int C; //포켓몬이 진화한 수
};
int main()
{
int N;//포켓몬의 종류수
int i;
int Sum;
int Max,Maxi;
scanf("%d",&N);
if(N>=1 && N<=70)
{
struct PokeMon *A=(struct PokeMon *) malloc(sizeof(struct PokeMon)*N);
//포켓몬 입력
for(i=0;i<N;i++)
{
while(1)
{
scanf("%s%*c",&A[i].P);
if(strlen(A[i].P)<=20) break;
return 0;
}
while(1)
{
scanf("%d%d%*c",&A[i].K,&A[i].M);
if((A[i].K>=12 && A[i].K<=400) && (A[i].M>=1 && A[i].M<=10000)) break;
return 0;
}
}
//포켓몬 진화한 수 구하면서 전체 합구하기
Sum=0;
for(i=0;i<N;i++)
{
A[i].C=0;
while(A[i].M>=A[i].K)
{
A[i].M=A[i].M-A[i].K+2;
A[i].C++;
}
Sum+=A[i].C;
}
//최대값과 최대값을 갖는 포켓몬 구하기
Max=A[0].C;Maxi=0;
for(i=1;i<N;i++)
if(Max<A[i].C)
{
Max=A[i].C;
Maxi=i;
}
//결과출력
printf("%d\n",Sum);
printf("%s",A[Maxi].P);
//해제
free(A);
}
return 0;
}
참고풀이 결과1]
참고풀이2]
#include <stdio.h>
#include <string.h>
int main()
{
int N;
char maxName[21];
int Sum;
int maxCnt=0;
int i;
scanf("%d%*c",&N);
if(N>=1 && N<=70)
{
for(i=1;i<=N;i++)
{
char name[21];
int K,M;
int cnt=0;
scanf("%s%*c",name);
scanf("%d%d%*c",&K,&M);
while(M>=K)
{
M=M-K+2;
cnt++;
}
Sum+=cnt;
if(cnt>maxCnt)
{
maxCnt=cnt;
strcpy(maxName, name);
}
else if(cnt==maxCnt && strlen(maxName)==0)
{
strcpy(maxName,name);
}
}
printf("%d\n",Sum);
printf("%s\n",maxName);
}
return 0;
}
참고풀이2 결과]
대한민국의 아름다운 영토, 독도의 봄
'프로그램 > C언어 1000제' 카테고리의 다른 글
C언어 236제] NCP Nextop Lv.3 3대 측정 (0) | 2025.03.18 |
---|---|
C언어 235제] NCP Nextop Lv.3 UCPC는 무엇의 약자일까? (0) | 2025.03.17 |
C언어 233제] NCP Nextop Lv.2 동전 0 (0) | 2025.03.12 |
C언어 232제] 유리 구슬(Marbles) (0) | 2025.03.01 |
C언어 231제] 스미스 수(Smith Numbers) (0) | 2025.02.27 |
댓글