카테고리
기본 알고리즘
나만의 카테고리
아이디어 짜기
문제 링크
programmers.co.kr/learn/courses/30/lessons/77484
요점
- int 배열의 순회 방법 중 어느 방법이 좋은지 비교해보자
참고 지식
- [Java] IntStream.of(int[])
풀이 (Java)
// 추천
import java.util.*;
class Solution {
public int[] solution(int[] lottos, int[] win_nums) {
int[] answer = new int[2];
int zeroCount = 0;
int correctNumCount = 0;
for (int lotto : lottos) {
if (lotto == 0) {
zeroCount++;
}
// for문 사용
for (int num : win_nums) {
if (lotto == num) {
correctNumCount++;
break;
}
}
}
answer[0] = 7 - correctNumCount - zeroCount;
answer[1] = 7 - correctNumCount;
if (answer[0] == 7) answer[0]--;
if (answer[1] == 7) answer[1]--;
return answer;
}
}
import java.util.*;
import java.util.stream.IntStream;
class Solution {
public int[] solution(int[] lottos, int[] win_nums) {
int[] answer = new int[2];
int zeroCount = 0;
int correctNumCount = 0;
for (int lotto : lottos) {
if (lotto == 0) {
zeroCount++;
}
//IntStream으로 변환하는 방법 사용
if (IntStream.of(win_nums).anyMatch(num -> (num == lotto))) {
correctNumCount++;
}
}
answer[0] = 7 - correctNumCount - zeroCount;
answer[1] = 7 - correctNumCount;
if (answer[0] == 7) answer[0]--;
if (answer[1] == 7) answer[1]--;
return answer;
}
}
import java.util.*;
class Solution {
public int[] solution(int[] lottos, int[] win_nums) {
int[] answer = new int[2];
int zeroCount = 0;
int correctNumCount = 0;
// Arrays.binarySearch 사용
Arrays.sort(win_nums);
for (int lotto : lottos) {
if (lotto == 0) {
zeroCount++;
continue;
}
try {
if (Arrays.binarySearch(win_nums, lotto) >= 0) {
correctNumCount++;
}
} catch (ArrayIndexOutOfBoundsException e) {
continue;
}
}
answer[0] = 7 - correctNumCount - zeroCount;
answer[1] = 7 - correctNumCount;
if (answer[0] == 7) answer[0]--;
if (answer[1] == 7) answer[1]--;
return answer;
}
}
문제는 간단해서 푸는데 어려움이 있으신 분들은 많이 없을 것으로 예상됩니다.
# Java로 풀었다면
근데 풀다 보니 for 문 중첩하는 코드가 보기 싫어서 IntStream을 사용하거나 배열 색인을 떠올리면 쉽게 생각나는 Arrays.binarySearch를 사용하게 됩니다.
근데 이것이 for문 중첩보다 절대 효율적이지 않습니다. 간단히 비교해 보겠습니다.
이 문제에서는 순회할 int 배열이 6개의 원소로 고정이 되어있어서 아주 작은 배열입니다.
1. IntStream VS for VS Arrays.binarySearch
위의 시간을 비교 해보시면 작은 배열일 경우 for문을 사용한 것이 비교할 수 없을만큼 효율적인 것을 알 수 있습니다. 물론 순회해야할 배열의 수가 매우 크다면 다른 방법들이 더 좋을 것입니다.
알고리즘 초보가 정리한 글입니다
더 좋은 방법이나 코드에 대한 코멘트 언제나 환영합니다!
반응형
'Algorithm > Algorithm Test' 카테고리의 다른 글
[프로그래머스] 괄호 회전하기 (Java) (0) | 2021.05.13 |
---|---|
[프로그래머스] 징검다리 건너기 (0) | 2021.05.11 |
[프로그래머스] 3진법 뒤집기(Java) (0) | 2021.03.28 |
[프로그래머스] 두 개 뽑아서 더하기(C++, Java) (0) | 2021.03.12 |
[프로그래머스] 도둑질 (Java) (0) | 2021.03.01 |