programmers.co.kr/learn/courses/30/lessons/68644
문제 요약
int 배열 numbers를 받아서 그 안의 두 개의 원소를 더해서 나올 수 있는 값들의 배열 answer을 반환하는 함수를 만들면 된다. 문제 자체는 전혀 어렵지 않기 때문에 어떻게 하면 깔끔하게 짤 수 있을지 고민하는 시간이 대부분이 었던 문제였다.
문제 풀이
어떻게 풀어야지 깔끔할까 고민하다가 boolean 배열을 이용하기로 했다.
numbers 배열의 원소 2개 합으로 나올 수 있는 값은 0 ~ 200 이기 때문에 크기 201의 boolean 배열을 선언하고, 반복문을 통해 나온 원소의 합이 처음 나온 수라면 boolean 배열의 해당 인덱스를 true로 바꾸고 카운트를 증가시켰다.
반복문이 모두 돌고나서 count 크기의 answer을 선언하고 boolean 배열이 true인 인덱스 값 들으로만 채워서 반환했다.
범위가 작은 문제였기 때문에 boolean 배열을 사용하여 풀 수 있었지만, numbers 배열에 허용되는 최대값이 더 컸다면 무리가 있다고 판단되었다. 아마 그럴 경우에는 중복된 값을 허용하지 않는 Set을 이용해서 푸는게 더 적절한 방법이라고 생각된다.
나의 코드
public class 두_개_뽑아서_더하기 {
public int[] solution(int[] numbers) {
boolean[] visit = new boolean[201]; // 만들 수 있는 수인지 boolean 배열 [0 ~ 200]
int count = 0; // 만들 수 있는 수의 개수 (answer 배열의 length)
/* 만들 수 있는 수 들을 찾기 */
for (int i = 0; i < numbers.length - 1; ++i) {
for (int j = i + 1; j < numbers.length; ++j) {
int temp = numbers[i] + numbers[j];
if (!visit[temp]) { // 중복 건너뛰기
visit[temp] = true;
count++;
}
}
}
/* answer 배열 선언하고 채우기 */
int[] answer = new int[count];
int index = 0;
for (int i = 0; i <= 200; ++i) {
if (visit[i])
answer[index++] = i;
}
return answer;
}
}
TreeSet 사용
import java.util.Set;
import java.util.TreeSet;
public class 두_개_뽑아서_더하기 {
public int[] solution(int[] numbers) {
Set<Integer> set = new TreeSet<>(); // 자동 정렬 해주는 HashSet 선언
for (int i = 0; i < numbers.length - 1; ++i) {
for (int j = i + 1; j < numbers.length; ++j) {
set.add(numbers[i] + numbers[j]);
}
}
int[] answer = new int[set.size()];
int index = 0;
for (int n : set) {
answer[index++] = n;
}
return answer;
}
}
'Algorithme > Programmers' 카테고리의 다른 글
[프로그래머스] 여행경로 Java (0) | 2020.10.16 |
---|---|
[프로그래머스] 단어 변환 Java (0) | 2020.10.14 |
[프로그래머스] 네트워크 Java (0) | 2020.10.13 |
[프로그래머스] 타겟 넘버 Java (0) | 2020.10.12 |
[프로그래머스] 삼각 달팽이 Java (0) | 2020.10.08 |