ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 프로그래머스 lv1 완주 하지 못한 선수
    Algorithm 2022. 1. 28. 16:42

    문제 설명

    수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다.

    마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요.

    제한사항
    • 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다.
    • completion의 길이는 participant의 길이보다 1 작습니다.
    • 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다.
    • 참가자 중에는 동명이인이 있을 수 있습니다.
    입출력 예
    ["leo", "kiki", "eden"] ["eden", "kiki"] "leo"
    ["marina", "josipa", "nikola", "vinko", "filipa"] ["josipa", "filipa", "marina", "nikola"] "vinko"
    ["mislav", "stanko", "mislav", "ana"] ["stanko", "ana", "mislav"] "mislav"
    입출력 예 설명

    예제 #1
    "leo"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

    예제 #2
    "vinko"는 참여자 명단에는 있지만, 완주자 명단에는 없기 때문에 완주하지 못했습니다.

    예제 #3
    "mislav"는 참여자 명단에는 두 명이 있지만, 완주자 명단에는 한 명밖에 없기 때문에 한명은 완주하지 못했습니다.

    public class 완주하지못한선수 {
        public static void main(String[] args) {
            String[] participant = {"mislav", "stanko", "mislav", "ana"};
            String[] completion = {"stanko", "ana", "mislav"};
    
            System.out.println(solution(participant, completion));
        }
    
        public static String solution(String[] participant, String[] completion) {
            String answer = "";
            Arrays.sort(participant);
            Arrays.sort(completion);
    
            for(int i = 0; i < completion.length; i++){
                if (!participant[i].equals(completion[i])){
                    answer = participant[i];
                    break;
                }
            }
            if(answer.equals("")){
                int length = participant.length;
                answer = participant[length - 1];
            }
            return answer;
        }

      저는 인텔리제이로 직접 코딩을 해서 문제를 풀었습니다. 아무래도 자동완성 이라던지 다양한 편의 기능을 사용하기 위해서 사용했습니다.결과값을 바로 테스트 해보기 위해서 우선 main메소드를 하나 만들어서 프로그래머스에 제공한 테스트 데이터를 두개의 배열로 선언 하고 함수를 호출해서 실행시켰습니다.우선  두개의 배열을 비교하기위해 Arrays.sort를 사용해서 알파벳 순서대로 String을 정렬해줬습니다.배열 정렬은 영문자 뿐만 아니라 한글, 숫자 전부 정렬이 가능합니다.

     

    문제해결을 위해서 2가지를 고려해야 하는데첫째는, 중복된 이름을 허용한다.

     

    둘째는, 정렬을 하고 두개의 배열을 비교 할 때 participant 배열의 마지막 index에 있는 선수가 완주하지 못한 경우를 고려해야 합니다.

     

    우선 for문을 통해서 completion 배열의 길이만큼 반복문을 돌리는데 반복될때마다 participant의 배열과 completion의 배열의 i번째 인덱스 값을 서로 비교해줍니다.

    예를 들어서, String[] participants = {"1", "2", "3", "4"};               

                     String[] completion = {"1", "3", "4"};

     

    정렬 후에 이렇게 두개의 배열이 있다고 가정을 합니다. 그렇다면 2가 완주를 하지 못한 선수이기 때문에 해당 선수의 이름을 가지고와야하는데 이것을 if 조건문에서 if( !participant[i].equals(completion[i]))라는 조건을 잡아서 String answer에 넣어줬습니다.그리고 나서는 break를 통해서 반복문을 탈출 했는데요그 이유는 이미 완주하지 못한 선수를 찾았다면 더이상 반복문을 계속해서 돌리는 것은 비효율적입니다.

    또한 중복되는 이름을 가진 선수가 완주를 하지 못했다면 로직이 꼬이게 되면서 올바른 값을 가지고 오지 못합니다.

    예를 들어서, String[] participants = {"1", "1", "3", "4"};

                     String[] completion = {"1", "3", "4"};

     

    이렇게 정렬된 두개의 배열이 있다면 완주 하지 못한 선수는 1이라는 선수 입니다. 그렇다면 1번째 인덱스에서 값을 비교해주고 나서 String answer에 1이라는 선수를 넣어주게 되는데 그 후에 2번째 index의 배열을 비교 할때도 선수의 이름이 다르기 때문에 String answer에 다시 넣어줍니다.

     

    이렇게 되면 완주하지못한 사람을 찾게 되는 것이아니라 뒤에있는 index들의 값을 계속 가지고 오게 되겠죠. 그렇기 때문에 break를 통해서 for문에서 탈출시킵니다.

     

    또한, String[] participants = {"1", "2", "3", "4"};

           String[] completion = {"1", "2", "3"};

    이렇게 두개의 배열이 있다면 완주하지 못한선수는 4입니다. 두 개의 배열을 비교를 했을때 index 0, 1, 2번째에 있는 선수들의 이름이 같기 때문에 String answer 는 초기화 되지 않고 비어있는 상태가 됩니다.그렇기 때문에, 밑에서 if(answer.equals(""))라는 조건을 추가해서 배열의 마지막 인덱스를 찾아서 완주하지 못한 마지막 선수를 찾아서 값을 넣어줬습니다.

     

    문제를 제출하고나서 다른 사람들의 풀이를 보니까 HashMap을 이용해서 문제를 해결한 코드가 있던데 아주 창의적이고 생각을 못해본 방향이었습니다. 우선 코드의 길이가 짧고 효율성 측면에서 아주 좋은 코드였습니다. 해당 풀이는 다른 블로그에도 공유 되어있어서 참고하면 될것 같습니다.

     

    코드의 질을 높이고 클린 코딩을 위해서 Programmers문제를 하루에 한개씩 풀으려고 하는데요 아주 많이 도움이 될것같습니다~~~~

Designed by Tistory.