티스토리 뷰
[Java/Programmers]
Lv.1 두 개 뽑아서 더하기
(월간 코드 챌린지 시즌 1)
⬇︎ ⬇︎ ⬇︎ 문 제 링 크 ⬇︎ ⬇︎ ⬇︎
programmers.co.kr/learn/courses/30/lessons/68644
입/출력
(입력)
정수 배열 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를 반환값으로 바꾸어 코드 작성한 것 보고 진짜 충격먹음... 바꾸면 오답처리 되는줄 알았지..^^ 반환값을 바꾸면 안된다는 고정관념?에 갇혀있던 나를 반성하게 됐다...ㅋㅋㅋㅋ
'Algorithm' 카테고리의 다른 글
[Java/Programmers] Lv.1 소수 만들기 (0) | 2021.04.12 |
---|---|
[Java/Programmers] Lv.1 신규 아이디 추천 (0) | 2021.04.10 |
[Java/Programmers] Lv.2 카카오프렌즈 컬러링북 (0) | 2021.04.08 |
[Java/Programmers] Lv.1 폰켓몬 (0) | 2021.04.07 |
[Java/백준(boj)] 2010번. 플러그 (0) | 2021.03.06 |