본문 바로가기
알고리즘/코딩 테스트 문제

[프로그래머스] 카드 뭉치(Java)

by 진진리 2023. 10. 11.
728x90
class Solution {
    public String solution(String[] cards1, String[] cards2, String[] goal) {;
        int flag = 0;
        int len1 = cards1.length;
        int len2 = cards2.length;
        int len = goal.length;
        int[] check1 = new int[len];
        int[] check2 = new int[len];
        
        for(int i=0;i<len1;i++){
            flag = 0;
            for(int j=0;j<len;j++){
                if(cards1[i].equals(goal[j])){
                    flag = 1;
                    check1[j] = 1;
                    for(int k=j+1;k<len;k++) if(check1[k]==1){
                        return "No";
                    }
                }
            }
            if(flag == 0) break;
        }

        for(int i=0;i<len2;i++){
            flag = 0;
            for(int j=0;j<len;j++){
                if(cards2[i].equals(goal[j])){
                    flag = 1;
                    check2[j] = 1;
                    for(int k=j+1;k<len;k++) if(check2[k]==1){
                        return "No";
                    }
                } 
            }
            if(flag == 0) break;
        }
        
        for(int i=0;i<len;i++){
            if(check1[i] == 0 && check2[i] == 0) return "No";
        }
        
        return "Yes";
    }
}

문제: cards1과 cards2의 카드들을 각각 내부의 순서대로 내서 goal을 만들 수 있으면 "Yes", 아니면 "No"

 

처음에 생각한 것: 각 카드의 단어들과 일치하는 goal의 단어의 인덱스를 기존 카드(cards1, 2) 단어의 자리에 대입한 int 배열을 각각 만든 후, 해당 인덱스들이 오름차순이면 Yes, 아니면 No로

-> goal의 모든 단어들이 cards1과 cards2에 모두 존재하지 않을 수도 있음

 

cards1과 cards2를 각각 살펴보면서 goal와 일치하는 단어가 있으면 해당 단어(goal)의 인덱스 자리에 1을 표시하는 check 배열을 각각 만든 후, check에 1을 표시하는 경우 그 뒤의 인덱스에 다른 1이 있으면(순서가 안맞으면) No 리턴.

마지막에 check1과 check2의 배열에 모두 0인 인덱스가 존재하면 No. 그 외의 경우는 Yes

-> goal에 없는 단어가 cards1,2의 필요한 단어 중간에 있는 경우를 고려하지 않음

 

flag를 이용해서 cards1과 cards2에서 goal에 없는 단어가 나오면 check에 표시하는 것을 중단하는 것을 추가

: 없는 단어는 사용 불가능하므로 사용 중단. 그 뒤의 단어를 볼 필요가 없음.

 

 

- 다른 사람 풀이 참고

괜히 너무 어렵게 생각해서 풀었다.

goal의 문자열을 순서대로 가져와서 cards1과 cards2에서 순서대로 하나씩 찾으면 된다.

 

수정한 코드:

class Solution {
    public String solution(String[] cards1, String[] cards2, String[] goal) {;
        int idx1 = 0;
        int idx2 = 0;
        
        for(int i=0;i<goal.length;i++){
            if(idx1<cards1.length && goal[i].equals(cards1[idx1])) idx1++;
            else if(idx2<cards2.length && goal[i].equals(cards2[idx2])) idx2++;
            else return "No";
        }
        return "Yes";                                                                     
    }
}