Today I Learned

최지웅·2024년 3월 16일
0

Today I Learned

목록 보기
117/238

오늘 할일
1. LeetCode
2. 강의?
3. 창엔 업무
4. 카카오팀 영입 등 지원
5. 챙 선물

오늘 한일
1. LeetCode

    1. Dota2 Senate의 마지막 testcase를 해결하기 위해 지난시간에 계획했던 방법인, announce the victory규칙을 위해 매 for루프마다 게임이 끝났는지를 확인하는 코드를 작성했지만 여전히 통과하지 못했다.
class Solution {
    private StringBuilder result;
    private char deleted_mark='-';
    private int delete_near_opponent(int index){
        if(result.charAt(index)==deleted_mark){
            return 1;
        }

        char current_team=result.charAt(index);
        int size=result.length();
        for(int i=index+1; i<size; i++){
            if(result.charAt(i)!=deleted_mark && result.charAt(i)!=current_team){
                result.setCharAt(i, deleted_mark);
                return 0;
            }
        }

        for(int i=index-1; i>=0; i--){
            if(result.charAt(i)!=deleted_mark && result.charAt(i)!=current_team){
                result.setCharAt(i, deleted_mark);
                return 0;
            }
        }

        return -1;
    }

    private boolean is_announce_the_victory(int index){
        for(int i=0; i<index-1; i++){
            if(result.charAt(i)==deleted_mark)
                continue;
            if(result.charAt(i)!=result.charAt(i+1)) {
                return false;
            }
        }

        for(int i=index+1; i<result.length()-2; i++){
            if(result.charAt(i)==deleted_mark)
                continue;
            if(result.charAt(i)!=result.charAt(i+1)){
                return false;
            }
        }

        if(index>=result.length() ||
                (result.charAt(index)==result.charAt(index+1))
                        && (result.charAt(index)!=deleted_mark)){
            return false;
        }

        return true;
    }
    public String predictPartyVictory(String senate) {
        int size=senate.length();
        result=new StringBuilder(senate);

        while(true){
            for(int i=0; i<size; i++){
                int val=delete_near_opponent(i);
                if(val==-1){
                    return result.charAt(i)=='R'?"Radiant":"Dire";
                } else if(val==1 || val==0) {
                    continue;
                } else if(is_announce_the_victory(i)) {
                    return result.charAt(0) == 'R' ? "Radiant" : "Dire";
                }else{
                    System.out.println("ERROR");
                }
            }
        }
    }
}

이 문제는 잠시 보류하기로 하겠다. 다음 문제가 조금 빠르게 해결되었을 시 남은 하루의 시간동안 계속 고려해보겠다. 문제를 제대로 이해했다면 통과해야할 코드인데 문제를 잘 못 이해하고 있는 부분이 있는 듯 해서 당장 접근할 수 있는 방법이 남아있지 않다.

Discussion을 확인해보니, Queue를 이용하는 문제이기에 마지막에 있는 Senate가 첫번째 Senate에 영향을 끼칠 수 있는 것으로 보인다. 즉, 라운드 마다 진행되는 게임이기에 현재 나의 경우 마지막 Senate는 Announce the victory외엔 ban을 하지 못하게 구현했는데, Queue를 이용하는 것으로 보아 첫번째 원소에 영향을 끼칠 수 있게 설계하면 될 듯 하다. 이는 문제 설계의 오류로 보이며 오늘은 시간이 많지 않기에 코드 전체의 수정을 내일 다시 시도해보겠다.

profile
이제 3학년..

0개의 댓글