안녕하세요.
백준보다 코드포스가 더 유익할 것 같아 코드포스를 하려고 합니다.
그런 김에 요즘 하루에 두어개 씩 문제를 푸는데 이 문제에 가장 시간을 오래 써서 가져와봤습니다.
근데 저 말고 다른 사람들도 많이 헤멘건지 carrot을 통해 확인해보니 풀기만 하면 그린 티어인 문제였습니다.
크롬의 확장프로그램 carrot을 통해 확인한 건데, 패널티를 엄청 먹고도 풀기만 하면 1330점 대의 mmr이 책정되는 것을 볼 수 있습니다.
코드포스도 mmr이 맞나요? 아무튼
문제는 이렇습니다.
캐릭터를 생성하는데 스텟을 찍을 겁니다.
스텟을 전부 찍었을 때 힘(srt)이 지능(int)을 초과하는 경우의 수를 출력해주면 됩니다.
ex) 힘 6 지능 4 스텟 3일 경우
힘 | 지능 |
9 | 4 |
8 | 5 |
7 | 6 |
로 3가지 입니다.
문제는 아주 짧고 간단하죠?
입력으로는 test case 의 횟수인 t가 먼저 입력되고,
t회만큼 힘, 지능, 추가 스텟이 입력됩니다.
저는 예외사항에 대해 경우를 나눠서 계산해줬는데요.
1. 힘에 스텟을 전부 찍었는데 여전히 힘이 지능보다 낮을 경우
ex) 힘 5 지능 10 스텟 5 이면 힘에 전부 찍어도 10/ 10으로 힘이 높지 않습니다.
2. 스텟을 추가로 찍을 수 없지만 이미 힘이 지능보다 클 경우 정도입니다.
ex) 힘 5 지능 4 스텟 0이면 이미 힘이 높습니다. -> 경우의 수는 1
기본적으로 이 글을 보고 계시고 제 풀이 방법이 마음에 들어서 읽고 계신다면 위의 내용은 이미 다 알고 계실 것이고 저랑 같은 부분에서 막히지 않을까 생각이 드는데요, 제가 막힌 부분에 대해서 설명드릴게요.
힘이 지능+스텟 보다 높을 때의 계산이 문제였습니다.
ex) 힘 5 지능 0 스텟 3
힘 | 지능 |
8 | 0 |
7 | 1 |
6 | 2 |
5 | 3 |
지능+ 스텟 < 힘
일 경우 경우의 수는 스텟 + 1이 됨이 당연합니다. 이 부분에 신경 써주시면 풀 수 있을 겁니다.
저는 뭐에 홀렸는지 위와 같은 상황에서 스텟 * 2를 출력해주고 있어서 계속 틀렸습니다.
중간에 뭘 틀렸는지 모르겠어서 계속 보고 한국어로 검색도 해봤는데 나오는게 없어서 제가 적었습니다.
처음에 이 실수만 안 하고 빠르게 제출했으면 민트 커트라인인 거로 보았을 때 확실히 사람들이 실수를 많이 한 문제인 것으로 판단되네요.
수고하세요
#include <stdio.h>
int main() {
int s,i,e;
int n;
scanf("%d", &n);
for(int p = 0; p < n; p++) {
int count = 0; //경우의 수를 담을 변수입니다.
scanf("%d %d %d", &s, &i, &e);
if(s + e <= i) count = 0;//힘에 스텟을 전부 찍었는데도 지능보다 낮으면 경우의 수는 0
else if(s + e > i) {
count += (s + e - i) / 2;
if((s + e - i) % 2 == 1) count++;
if(s > e + i) {
count += e;
}
}
if(e == 0 && count > 0) count = 1;
if(e == 0 && s > i) count = 1; //추가 스텟이 없는데 이미 힘이 지능보다 클 경우 1
else if(count > e * 2) count = e + 1; //이 부분을 제대로 처리 못했습니다.
printf("%d\n", count);
}
}
'코드포스' 카테고리의 다른 글
코드포스 Educational Codeforces Round 129 A, B, C 풀이 (0) | 2022.05.24 |
---|---|
코드포스 #793 (Div. 2) (0) | 2022.05.23 |
코드포스 Global Round 20 A, B, C 풀이 (0) | 2022.05.22 |
코드포스 #792 (Div. 1 + Div. 2) A, B 풀이 (0) | 2022.05.20 |
코드포스 #779 (Div. 2) - A, C 풀이 (0) | 2022.05.19 |