티스토리 뷰

 

[Java/Programmers]

Lv.1 두 개 뽑아서 더하기

(월간 코드 챌린지 시즌 1)

 

⬇︎ ⬇︎ ⬇︎ 문 제 링 크 ⬇︎ ⬇︎ ⬇︎

programmers.co.kr/learn/courses/30/lessons/68644

 

코딩테스트 연습 - 두 개 뽑아서 더하기

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요. 제한

programmers.co.kr

 

 


 

 

 

입/출력

 

(입력)

정수 배열 numbers

  • numbers의 길이는 2 이상 100 이하입니다.
  • numbers의 모든 수는 0 이상 100 이하입니다.

 

(출력)

 numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 오름차순으로 담은 배열 answer

 

 

해결과정

 

1. HashSet을 이용한 풀이 시도 -> 입력값, 반환값이 array라 쓸데 없이 변환코드가 많아질 것 같아 코드 엎음

2. ArrayList를 이용한 풀이 시도 -> 한번에 맞추진 못했으나 결국 정답 풀이 성공

>> for문을 두번 사용하되 조건문을 이용해 최대한 불필요한 반복문 실행을 줄여보려고 노력했다.

 

 

풀이

 

ver.1 : 문제에서 주어진 테스트 케이스들은 정상적으로 실행되지만 채점 테스트 케이스는 1개만 정답 처리되는 코드

public static int[] solution(int[] numbers) {
        Arrays.sort(numbers)
        
        ArrayList<Integer> rslt = new ArrayList<>();

        for(int i = 0; i < numbers.length - 1; i++) {
            // 배열에 중복값이 있는 경우 for문을 돌리지 않고 pass 할 수 있도록 조건문 설정
            if(i != 0 && numbers[i - 1] == numbers[i]) {
                continue;
            } else {
                for (int j = i + 1; j < numbers.length; j++) {
                    int sum = numbers[i] + numbers[j];
                    // 결과 값 중복 여부 체크
                    if (!rslt.contains(sum)) { ;
                        rslt.add(sum);
                    }
                }
            }
        }
        // 다시 배열에 저장
        int[] answer = new int[rslt.size()];
        for(int i = 0; i < rslt.size(); i++) {
            answer[i] = rslt.get(i);
        }

        return answer;
 }

- 정렬 부분에서 문제가 있다는 것을 프로그래머스 질문 페이지를 보면서 알게 되었다.

- solutions() 함수 시작에서 numbers를 정렬해주는 것은 의미가 없고, 마지막에 결과값을 저장하는 arrayList를 정렬해 배열에 삽입해주는 것이 결과값을 오름차순으로 만들어주는 방법이라 코드를 수정하였다.

- 문제에서 주어진 테스트케이스에서는 오류 없이 돌아가서 이 부분이 문제라는 것을 깨닫기까지 빠른 시간이 소요되진 않았던게 아쉽다.

- 테케도 1개는 맞았던 것을 보면 문제에서 주어진 테스트케이스 중 하나였거나, 그와 비슷한 배열이었을 것으로 예상된다.

 

 

⭕️ ver.2 : 반환 값이 int[] 인 코드

public static int[] solution(int[] numbers) {
        
        ArrayList<Integer> rslt = new ArrayList<>();

        for(int i = 0; i < numbers.length - 1; i++) {
            // 배열에 중복값이 있는 경우 for문을 돌리지 않고 pass 할 수 있도록 조건문 설정
            if(i != 0 && numbers[i - 1] == numbers[i]) {
                continue;
            } else {
                for (int j = i + 1; j < numbers.length; j++) {
                    int sum = numbers[i] + numbers[j];
                    // 결과 값 중복 여부 체크
                    if (!rslt.contains(sum)) { ;
                        rslt.add(sum);
                    }
                }
            }
        }
        
        // 결과 값을 오름차순으로 저장해야 하므로
        Collections.sort(rslt);

        // 다시 배열에 저장
        int[] answer = new int[rslt.size()];
        for(int i = 0; i < rslt.size(); i++) {
            answer[i] = rslt.get(i);
        }

        return answer;
 }

- 수정한 코드에서는 결과값을 모두 저장한 후 sort 함수를 이용해 오름차순으로 정렬한다.

- 반환값이 int형 배열이라 결과값을 ArrayList에서 int형 배열로 변환하는 코드가 필요했다.

 

 

⭕️ ver.2 : 반환 값이 ArrayList<Integer> 인 코드

public ArrayList<Integer> solution(int[] numbers) {
        ArrayList<Integer> rslt = new ArrayList<>();

        for(int i = 0; i < numbers.length - 1; i++) {
            if(i != 0 && numbers[i - 1] == numbers[i]) {
                continue;
            } else {
                for (int j = i + 1; j < numbers.length; j++) {
                    int sum = numbers[i] + numbers[j];
                    if (!rslt.contains(sum)) { ;
                        rslt.add(sum);
                    }
                }
            }
        }
        Collections.sort(rslt);
        return rslt;
}

- 프로그래머스에서 문제 정답자만 확인할 수 있는 다른 사람이 작성한 코드 페이지에서 어떤 분이 반환값 타입을 변경하셔도 정답 처리되셨길래 불필요한 타입 변환 코드들을 없애보았다.

 

 

후기

 

자존심때문에 레퍼런스 활용 없이 온전히 내 힘으로 풀어보려다가 생각보다 문제 풀이하는데 너무 오랜 시간이 소요됐다.

(문제 이해 + 풀이 + 회고 + 티스토리 게시물 정리까지 총 2시간 정도 소요됨)

계속 채점 테케 1개만 정답처리돼서 의문이었는데 알고보니 정렬을 안해서,,, ㅠㅠ,,, 멍청....

그리고 solution() 함수의 반환값을 바꿔도 정답처리되는 것이 넘 충격적이었다. 프로그래머스에서 다른분들 코드 보는데 ArrayList를 반환값으로 바꾸어 코드 작성한 것 보고 진짜 충격먹음... 바꾸면 오답처리 되는줄 알았지..^^ 반환값을 바꾸면 안된다는 고정관념?에 갇혀있던 나를 반성하게 됐다...ㅋㅋㅋㅋ

 

 

댓글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Total
Today
Yesterday
공지사항
최근에 올라온 글