Welcome! Everything is fine.

[프로그래머스/Lv.1] 카드뭉치 - Java 본문

프로그래머스/Lv.1

[프로그래머스/Lv.1] 카드뭉치 - Java

개발곰발 2024. 4. 16.
728x90

📌 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

📌 풀이

카드 뭉치의 순서대로 단어 배열을 만들 수 있는지 확인하는 문제이다. 나는 ArrayList 2개를 이용하여 풀었는데, 다른 사람들의 코드를 보니 그냥 주어진 배열로도 풀 수 있고, 큐를 사용한 답안도 있었다.

 

내가 푼 방식에 대해 설명하자면, ArrayList를 2개 만들고 각각의 리스트에 cards1, cards2 배열을 옮겨 담았다. 그리고나서 goal 배열을 돌면서 goal[i] 번째 요소가 cards1과 cards2에 순서대로 있는지 확인한다. 여기서 for문을 2개를 만들어 각각 돌았는데 ArrayList를 이용한 다른 코드를 보니 굳이 안돌아도 되는 것이었다..🙄 if - else if - else 문으로 적절하게 조건을 나눠주면 된다. 다른 답안을 보고 고친 답안으로 설명하자면 다음과 같다.

  • arr가 비어있지 않고, arr의 0번째 요소가 goal[i] 번째와 같다면
    • arr의 0번째 요소를 지운다.
  • arr2가 비어있지 않고, arr2의 0번째 요소가 goal[i] 번째와 같다면
    • arr2의 0번째 요소를 지운다.
  • 위 2가지 경우에 해당하지 않으면 answer에 "No"를 넣은 후 빠져나온다.

📌 전체 코드

처음 작성한 답안

처음 작성한 답안도 정답이기는 했지만, 좀 더 간단하게 작성할 수 있을 것 같다.

import java.util.ArrayList;

class Solution {
    public String solution(String[] cards1, String[] cards2, String[] goal) {
        String answer = "Yes";
        ArrayList<String> arr = new ArrayList<>();
        ArrayList<String> arr2 = new ArrayList<>();
        
        for (int i = 0; i < goal.length; i++) {
            arr.add(goal[i]);
            arr2.add(goal[i]);
        }
        
        for (int i = 0; i < goal.length; i++) {
            for (int j = 0; j < cards1.length; j++) {
                if (goal[i].equals(cards1[j])) arr.remove(goal[i]);
            }
            
            for (int k = 0; k < cards2.length; k++) {
                if (goal[i].equals(cards2[k])) arr2.remove(goal[i]);
            }
        }
        
        for (int i = 0; i < arr.size(); i++) {
            if (!cards2[i].equals(arr.get(i))) answer = "No";
        }
        
        for (int i = 0; i < arr2.size(); i++) {
            if (!cards1[i].equals(arr2.get(i))) answer = "No";
        }
        
        return answer;
    }
}

 

다른 코드를 보고 고친 답안

새로 고친 답안은 ArrayList에 배열을 넣는 방식을 고친 점이나 for문을 개수를 줄인 점에서 가독성이 더 좋다.

import java.util.*;

class Solution {
    public String solution(String[] cards1, String[] cards2, String[] goal) {
        String answer = "Yes";
        ArrayList<String> arr = new ArrayList<>(Arrays.asList(cards1));
        ArrayList<String> arr2 = new ArrayList<>(Arrays.asList(cards2));
        
        for (int i = 0; i < goal.length; i++) {
            if (!arr.isEmpty() && arr.get(0).equals(goal[i])) {
                arr.remove(0);
            } else if (!arr2.isEmpty() && arr2.get(0).equals(goal[i])) {
                arr2.remove(0);
            } else {
                answer = "No";
                break;
            }
        }
        
        return answer;
    }
}

📌 다른 코드

다른 코드들을 보니 인덱스만을 이용해서 훨씬 간단하게 풀 수 있었다. 내가 for문을 마구 사용한 것도 cards1과 cards2의 길이가 다를 수 있기 때문이었는데, 각각의 인덱스를 만들어 놓고 사용한다면 그 문제를 해결할 수 있었다. 또한 다른 배열을 사용하는 것보다 시간도 빨랐다.

import java.io.*;

class Solution {
    public String solution(String[] cards1, String[] cards2, String[] goal) {
        int cardIdx1 = 0;
        int cardIdx2 = 0;

        for(int i=0; i<goal.length; i++){
            String target = goal[i];

            if(cardIdx1 < cards1.length && target.equals(cards1[cardIdx1]))
                cardIdx1 ++;
            else if (cardIdx2 < cards2.length && target.equals(cards2[cardIdx2]))
                cardIdx2++;
            else
                return "No";
        }

        return "Yes";
    }
}