728x90
코드 힌트
- 배열 정렬을 이용한 접근:
- 입력된 4개의 정수를 배열에 저장하고, 배열을 오름차순으로 정렬합니다.
- 정렬된 배열을 기반으로 각 숫자의 빈도와 위치를 쉽게 확인할 수 있습니다.
- 조건 예시:
- 만약 정렬된 배열의 결과가 a, b, c, d일 때:
- if a == d: 모든 값이 동일합니다. (예: [2, 2, 2, 2])
- else if a == c || b == d: 3개의 숫자가 같고 1개가 다릅니다. (예: [2, 2, 2, 3] 또는 [1, 2, 2, 2])
- 추가적인 조건문은 스스로 생각해서 해보시는 것을 추천합니다.
- 만약 정렬된 배열의 결과가 a, b, c, d일 때:
- 조건문 작성:
- 모든 숫자가 같을 경우: 배열의 모든 값이 동일하면 결과는 1111 * a입니다. (예: [3, 3, 3, 3] → 1111 * 3)
- 3개의 숫자가 같고 1개가 다른 경우: 배열에서 같은 숫자가 3번 출현하고, 나머지 1개의 숫자가 다를 때, 결과는 (10 * (같은 숫자) + (다른 숫자))^2입니다. (예: [2, 2, 2, 3] → (10 * 2 + 3)^2)
- 2개의 숫자가 각각 2개씩 반복되는 경우: 배열에서 두 개의 숫자가 각각 두 번씩 출현할 때, 결과는 (숫자1 + 숫자2) * |숫자1 - 숫자2|입니다. (예: [1, 1, 2, 2] → (1 + 2) * |1 - 2|)
- 3개의 숫자가 모두 다를 경우: 배열에서 서로 다른 숫자가 3개 있을 때, 결과는 중간값 * 최대값입니다. (예: [1, 2, 3, 4] → 2 * 3)
- HashMap 사용해보기:
HashMap을 이용해서 문제를 풀 수 있습니다. HashMap을 연습하고 싶으신 분은 해보시는 걸 추천합니다.
HashMap 정답도 밑에 적어놓았습니다.
- 빈도수 기록: HashMap을 사용하여 각 숫자의 출현 빈도를 기록합니다. key는 숫자, value는 출현 횟수입니다.
- 키 추출 및 정렬: keySet() 메서드를 통해 key를 추출하고, 빈도수 기준으로 정렬하여 조건을 확인합니다.
- 가독성 및 효율성: HashMap을 사용하는 경우, 빈도수의 계산과 조건 검토가 효율적이며, 코드의 가독성도 높일 수 있습니다.
정답은 더보기 클릭
더보기
import java.util.Arrays;
class Solution {
public int solution(int a, int b, int c, int d) {
// 입력된 4개의 정수를 배열에 저장
int[] arr = {a, b, c, d};
// 배열을 오름차순으로 정렬
Arrays.sort(arr);
// 정렬된 배열에서 값의 빈도수를 체크
// 모든 숫자가 같을 경우
// 예: [2, 2, 2, 2]
if (arr[0] == arr[3]) {
return 1111 * arr[0]; // 모든 숫자가 동일하므로, 1111 * 그 숫자를 반환
}
// 3개의 숫자가 같고 1개가 다른 경우
// 예: [1, 3, 3, 3] 또는 [1, 1, 1, 3]
else if (arr[0] == arr[2] || arr[1] == arr[3]) {
int p = arr[2]; // 중복된 수 (예: 3)
int q = arr[3] + arr[0] - arr[2]; // 중복되지 않은 수 (예: 1)
return (int) Math.pow(10 * p + q, 2); // 결과: (10 * p + q) ^ 2
}
// 2개의 숫자가 각각 2개씩 반복되는 경우
// 예: [1, 1, 2, 2]
else if (arr[0] == arr[1] && arr[2] == arr[3]) {
return (arr[0] + arr[2]) * (arr[2] - arr[0]); // (숫자1 + 숫자2) * |숫자2 - 숫자1|
}
// 2개의 숫자가 같고 나머지 2개의 수는 다를 때
// 예: [1, 1, 2, 3]
else if (arr[0] == arr[1]) {
return arr[2] * arr[3]; // 두 다른 숫자의 곱을 반환
}
else if (arr[1] == arr[2]) {
return arr[0] * arr[3]; // 두 다른 숫자의 곱을 반환
}
else if (arr[2] == arr[3]) {
return arr[0] * arr[1]; // 두 다른 숫자의 곱을 반환
}
// 모든 숫자가 다를 때
// 예: [1, 2, 3, 4]
else {
return arr[0]; // 가장 작은 숫자를 반환
}
}
}
HashMap 정답
import java.util.*;
class Solution {
public int solution(int a, int b, int c, int d) {
// 입력된 4개의 정수를 배열에 저장
int[] arr = {a, b, c, d};
// 각 숫자의 출현 빈도를 저장할 HashMap 생성
HashMap<Integer, Integer> map = new HashMap<>();
for (int n : arr) {
// 숫자의 출현 빈도 업데이트
map.put(n, map.getOrDefault(n, 0) + 1);
}
// HashMap의 키를 리스트에 저장하고, 빈도수 기준으로 내림차순 정렬
List<Integer> keySet = new ArrayList<>(map.keySet());
Collections.sort(keySet, (o1, o2) -> map.get(o2).compareTo(map.get(o1)));
// 조건에 따라 결과를 계산
if (map.size() == 1) {
// 모든 숫자가 같을 경우
return 1111 * a;
} else if (map.size() == 2 && map.get(keySet.get(0)) == 3) {
// 3개의 숫자가 같고 나머지 1개가 다른 경우
return (int) Math.pow((10 * keySet.get(0) + keySet.get(1)), 2);
} else if (map.size() == 2 && map.get(keySet.get(0)) == 2) {
// 2개의 숫자가 각각 2개씩 반복되는 경우
int n = keySet.get(0);
int m = keySet.get(1);
return (n + m) * Math.abs(n - m);
} else if (map.size() == 3) {
// 3개의 숫자가 모두 다를 경우
return keySet.get(1) * keySet.get(2);
}
// 위의 모든 조건에 해당하지 않는 경우
return keySet.get(0);
}
}
728x90
'프로그래머스(Java) > Level 0' 카테고리의 다른 글
[프로그래머스] 2차원으로 만들기 (0) | 2024.08.02 |
---|---|
[프로그래머스] 배열 만들기 5 (0) | 2024.08.01 |
[프로그래머스] 간단한 논리 연산 (0) | 2024.08.01 |
[프로그래머스] 타겟넘버 (0) | 2024.08.01 |
[프로그래머스] 배열 만들기 4 (0) | 2024.07.30 |