2023.04.11(4)

Jay Ji·2023년 4월 11일
0
post-thumbnail

Problem

Participant에 있는 리스트와 Completition에 있는 리스트가 주어질 때, 완주하지 못한 선수의 이름을 return하는 solution 구축. 문제 바로가기

What I tried

나의 전략은 아래와 같았고 수정을 여러번 했다:

이 문제의 핵심 : participant list와 completion list를 비교하여 없는 것 찾기
1. for문 사용하여 participant 돌리기
2. for문 사용하여 completion 돌리기
3. 돌린 후 있는지 없는지 비교
4. if문 사용하여 만약 있다면 true, 없다면 false
5. false인 값을 출력

What was Wrong?

이번 문제를 풀면서 두개의 문제점에 직면하게 되었다.

class Solution {
    public String solution(String[] participant, String[] completion) {
        int a = 0;

        for(int i = 0; i < participant.length; i++){
            for(int j = 0; j < completion.length; j++){
                if (i==j){
                    a = Integer.parseInt("");
                } else {
                    a = Integer.parseInt(participant[i]);
                }
            }
        }
        String answer = String.valueOf(a);
        return answer;
    }
}

처음 나의 approach는 for 문을 반복적으로 사용 후 if문으로 누가 없는지 찾아내려고 하였지만, 위와 같이 코드를 짜고 완전히 막혔다. 일단 생각나는대로 짜보기는 했으나, 나의 로직으로는 이해가가지만 컴퓨터는 이해를 하지 못한것 같다.

이때 한동안 생각을 하다 구글링으로 Array.sort()라는 메소드를 보았다. 두개의 리스트를 순서대로 정리하여, 매칭되지 않는 사람이 있다면, 그 사람이 아마 경기를 완주하지 못한 사람이 아닐까? 하고 아래와 같이 코드를 작성해 보았다.

class Solution {
    public String solution(String[] participant, String[] completion) {
        Arrays.sort(participant);
        Arrays.sort(completion);

        int i;
        for(i = 0; i < completion.length ; i++){
            if(!participant[i].equals(completion[i])){
            }
        }
        return participant[i];
    }
}

하지만 두번째 문제를 직면하게되는데, 예제 테스트 3개중 2개는 통과했으나 1개는 통과하지 못하고 엉뚱한 이름을 출력하였다. 예제를 자세히 보니 반복되는 이름이 있었고, 위의 코드가 제대로 process하지 못한것 같았다.

What I Learned

class Solution {
    public String solution(String[] participant, String[] completion) {
        Arrays.sort(participant);
        Arrays.sort(completion);

        int i;
        for(i = 0; i < completion.length ; i++){
            if(!participant[i].equals(completion[i])){
                return  participant[i];
            }
        }
        return participant[i];
    }
}

위의 코드로 수정하였고, 3번째 테스트도 통과할 수 있었다. 전 코드와 다른점은 return participant[i]가 if문 안에 하나가 더 추가가 된것이다. 왜 추가가 되어야 했을까? 해당 문제를 풀면서 아래와 같이 배울 수 있었다:

1. Arrays.sort()

배열을 정렬하기 위해서 사용되는 함수. 문자열을 정렬하면, 대문자가 소문자보다 앞에 오도록 정렬이 되니 참고** 그리고 요소가 undefined인 경우에는 문자열로 변환되지 않고 배열의 맨 끝으로 정렬 됨

2. return participant [i]이 왜 if문 안에도 들어가야하는지?

loop 안에 있는 return participant [i]는 for문과 if문을 돌면서 completion array에는 없는 사람의 이름을 바로 출력해둔다. 그리고 loop 밖에 있는 return participant [i]는 loop이 완전히 끝난 뒤, completion array에 없는 사람을 보여주기 위해서 (그리고 loop안에 return participant [i]가 없으면 테스트 3이 통과되지 못함. 아마도 반복되는 문자를 인식하지 못하는것 같음)

3. int i;는 왜 for문 밖에 있는지?

int i를 loop 밖에 사용한 이유는 loop이 끝나고 나서도 사용 할 수 있기 위함. (그렇기 때문에 for문에서 int i = 0 대신 i=0로 표시됨)

이유는 participant 배열에서 completion 배열에 없는 참가자를 찾기 위해서이며, for 루프에서 return 문을 만나면 루프를 즉시 빠져나가므로, 루프가 끝난 후에는 아직 확인되지 않은 참가자를 찾기 위해 i 변수를 사용해야 한다.

따라서 int i; 문장은 루프 밖에서 i 변수를 선언해 놓고, for 루프에서는 초기화만 하고 증감식을 생략. 이렇게 하면 루프가 끝난 후에도 i 변수를 사용할 수 있기 때문.

profile
Think out of the Box

0개의 댓글