Coding History

국비 지원 IT(웹앱개발) 취업반 강의 7일차

BlackBirdIT 2024. 6. 5. 22:06

오늘 수업은 딱히 배웠다고 할거는 테스트 케이스가 있다. 하지만 이게 주가 아니라 문제 풀이가 오늘 하루 수업의 주된 일이였고 나는 프로그래머스 0레벨 문제들을 순서대로 풀어 나갔다. 그런데 개미 군단에서 턱하고 막혔고, 지금 시간이.. 곧 9시를 향해간다. 수업시간 3시부터 붙들고 있었으니까, 수업 마치고 내가 맥도날드까지 이동한 시간 30분정도를 뺀다고 가정해도 대충 5~6시간 동안 이 한문제를 붙들고 씨름했다. 와중에 푼 줄 알고 프로그래머스에 올리니 검증하지 않았던 경우의 수 때문에 100점 만점에 80점을 맞고 좌절했었다.
서론은 이만 그만 하고 내가 겪었던 문제의 핵심이 뭐였냐 하면, 코드로 설명하겠다.

class Solution {
    public int solution(int hp) {
        int gAntCount = 0;
        int sAntCount = 0;
        int wAntCount = 0;
        int gAntAtk = 5;
        int sAntAtk = 3;
        int wAntAtk = 1;

        if (hp >= gAntAtk) {
            gAntCount = hp / gAntAtk;
            hp = gAntCount % gAntAtk; 
        }
        if (hp >= sAntAtk) {
            sAntCount = hp / sAntAtk;
            hp = gAntCount % sAntAtk;
        }
        if (hp >= wAntAtk){
            wAntCount = hp;
        }


        return gAntCount + sAntCount + wAntCount;
    }
}

이까지는 수업이 마칠 때 선생님이 주신 힌트 때문에 잘 왔다. 그런데 오늘 배운 테스트 케이스로 결과값을 돌려보니 계속 틀린 값이 나오는게 아닌가.

진짜 미쳐버리는 줄 알았다. 경우의 수를 펜으로 쓰고 찾은 다음 코드 중간에 return 값으로 퉁치려해도 안되고, 도대체 뭐가 문제인지 감조차 잡을 수 없었다.

만약 매개 변수인 hp에 10을 넣는다고 가정해보자.

if (hp >= gAntAtk) {         // 10 >= 5 => true 조건문 작동
    gAntCount = hp / gAntAtk; // 2 = 10 / 5
    hp = gAntCount % gAntAtk; // 0 = 2 % 5
}
//---if문 조건 부합하지 않음

return gAntCount + sAntCount + wAntCount; // 2 + 0 + 0 = 2;
//결과값 : 2

난 이런 결과값을 기대했는데 계속 4가 나오는거다...
9를 넣었을 때도 마찬가지다

그렇게 생각하다보니 아 내가 2를 5로 나누었을 때 나머지는 0이라고 생각했는데 왜 4를 5로 나누었을 때 나머지는 4라고 생각했지? 이런 의문이 들길래 나머지를 구하는 식이 틀렸다는 것을 알았고, 나름 검증도 해 보았다.

class Main {
    public static void main(String[] args) {
        int hp = 10;
        int gc = 0;
        int ga = 5;

        if (hp >= ga) {
            gc = hp / ga;
            hp = gc % ga;
        }
        System.out.println(hp);

    }
}
//출력 : 2

근데 이건 또 값이 2가 나오더라. 이 때부터 진짜 혼돈이였는데 도대체 왜 0이 아니고 2가 나오지? 부터 4를 나누는건 1이 나왔다. 그래서 검색하지 말라던 선생님의 말은 한계가 도달 할 때 까지는 어떤 도움 없이 혼자 하라는 것으로 해석하고 %에 대해서 좀 제대로 알아봤다. (아마 정답을 검색하지 말라고 하신 말이긴 할 것이다.) 그렇게 다른 프로젝트에서 연산만 해보니까, 만약 a % b 라는 연산에서 a 값이 b 보다 작으면 무조건 a 값이 출력 되더라.

이미 내 뇌는 쓸대로 썻고 과부화가 온 상태라 그럼 10을 5로 나누면 0이 나올테니 나누는 값을 hp, 즉 매개변수로 싹 다 바꿔버리자는 생각이 들었고 바꾸고 테스트를 돌리니 마법같이 모든게 해결되었다..

????????????

왜징?????????? 일단 코드를 보면

class Solution {
    public int solution(int hp) {
        int gAntCount = 0;
        int sAntCount = 0;
        int wAntCount = 0;
        int gAntAtk = 5;
        int sAntAtk = 3;
        int wAntAtk = 1;

        if (hp >= gAntAtk) {
            gAntCount = hp / gAntAtk;
            hp = hp % gAntAtk;
        }
        if (hp >= sAntAtk) {
            sAntCount = hp / sAntAtk;
            hp = hp % sAntAtk;
        }
        if (hp >= wAntAtk){
            wAntCount = hp;
        }


        return gAntCount + sAntCount + wAntCount;
    }
}

그의 영롱한 자태는 이러하다. 그래서 검증도 내가 한번 해보았다. (이 글을 쓰다보면 이해 될 것 같아서 이해가 안된 상태로 쓰는 글이니 두서 없어도 양해 바란다.) 마찬가지로 10을 넣었을 때를 생각하고 일단 해보겠다.

if (hp >= gAntAtk) {         // 10 >= 5
    gAntCount = hp / gAntAtk;// 2 = 10 / 5
    hp = hp % gAntAtk;         // 0 = 10 % 5
}
if (hp >= sAntAtk) {         // 조겅 부합하지 않음.
    sAntCount = hp / sAntAtk;
    hp = hp % sAntAtk;
}
if (hp >= wAntAtk){ //조건x
    wAntCount = hp;
}


return gAntCount + sAntCount + wAntCount; // 2 + 0 + 0 = 2
    }
}

이걸 생각하고 코드를 쓴건 맞는데 생각해보니까 내가 hp에 2를 넣은 테스트 케이스는 왜 통과한건지 도통 이해가 안되는 것이다. 방금 말한 원리대로 생각하면

if (hp >= gAntAtk) {         // 2 >= 5
    gAntCount = hp / gAntAtk;// 2 = 10 / 5
    hp = hp % gAntAtk;         // 0 = 10 % 5
}
if (hp >= sAntAtk) {         // 조겅 부합하지 않음.
    sAntCount = hp / sAntAtk;
    hp = hp % sAntAtk;
}
if (hp >= wAntAtk){ //조건x
    wAntCount = hp;
}


return gAntCount + sAntCount + wAntCount; // 2 + 0 + 0 = 2
    }
}

어 깨달았다. 애초에 처음 조건에 부합하지 않으니까 나머지를 구할 일이 없는거구나. 유레카...

허무하네요. 아무튼 이렇게 잘 해결했습니다. 너무 오래 한데 앉아서 붙잡고 있어서 머리가 잘 안돌아간다..

그래도 꾸역꾸역 해결 했으니까 일단은 밥 먹고 좋은 꿈 꾸러 가야겠다. 내일은 이 문제 다른 사람들 풀이도 좀 살펴보고 다른 문제들도 풀 생각이다.

내일부터 당분간 수업은 없다. 하지만 평일엔 포스팅 꾸준히 하겠다.