안녕하세요.
백준보다 코드포스가 더 유익할 것 같아 코드포스를 하려고 합니다.
그런 김에 요즘 하루에 두어개 씩 문제를 푸는데 이 문제에 가장 시간을 오래 써서 가져와봤습니다.
근데 저 말고 다른 사람들도 많이 헤멘건지 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);
    }
}

+ Recent posts