1. for문
- 반복문을 통해 배열의 요소를 순회, 요소와 key값을 하나씩 비교하며 key값과 일치하는 값이 존재하는지 확인한다.
public void solutionFor() {
int[] lottos = {44, 1, 0, 0, 31, 25};
int[] win_nums = {31, 10, 45, 1, 6, 19};
int prize_count = 0;
for( int lotto : lottos )
{
for( int win_num : win_nums )
{
if( lotto == win_num )
{
prize_count++;
break;
}
}
}
System.out.println(Math.min(7-prize_count, 6));
}
2. binarySearch()
- 이진탐색 메서드를 사용해 정렬된 배열에서 key값을 검색한다.
key값 검색에 성공하면 해당 값이 존재하는 위치(index >= 0)를 반환하고, key값 검색에 실패하면 삽입 포인트(index < 0)를 반환한다.
*삽입위치(inertion point): 배열에 key값이 삽입된다면 어느 위치(index)에 들어와야 할지 알려준다. 탐색 실패시 음수값을 반환하는데 이 음수값을 -(index)-1하면 양수 삽입 위치를 알 수 있다.
binarySearch() 메서드는 반드시 정렬된 배열에 사용해야 한다.
이진탐색 배열요소-key값과의 대소비교를 통해 탐색 범위를 줄여나가기 때문에 정렬되지 않은 배열에 사용하면 기대한 결과와 다르게 이상한 값이 반환된다.
public void solutionBinarySearch() {
int[] lottos = {44, 1, 0, 0, 31, 25};
int[] win_nums = {31, 10, 45, 1, 6, 19};
int prize_count = 0;
Arrays.sort(lottos);
Arrays.sort(win_nums);
for( int lotto : lottos )
{
if( Arrays.binarySearch(win_nums, lotto) >= 0 )
{
prize_count++;
}
}
System.out.println(Math.min(7-prize_count, 6));
}
3. anyMath()
- Arrays.stream(int[] array) 메서드를 사용하여 int 배열을 IntStream으로 변경한 후,
.anyMatch() 메서드를 사용해 요소 중에서 key값과 일치하는 값이 존재하는지 여부(true/false)를 확인한다.
public void solutionAnyMath() {
int[] lottos = {44, 1, 0, 0, 31, 25};
int[] win_nums = {31, 10, 45, 1, 6, 19};
int prize_count = 0;
for( int lotto : lottos )
{
if( Arrays.stream(win_nums).anyMatch(i -> i == lotto) )
{
prize_count++;
}
}
System.out.println(Math.min(7-prize_count, 6));
}
4. contains()
- Arrays.asList() 메서드를 사용하여 배열을 List로 변경한 후,
contains() 메서드를 사용하여 리스트 내 요소 중에 key값이 존재 여부를 확인한다.
public static int solutionContains() {
Integer[] lottos = {44, 1, 0, 0, 31, 25};
Integer[] win_nums = {31, 10, 45, 1, 6, 19};
int prize_count = 0;
for( Integer lotto : lottos )
{
if( Arrays.asList(win_nums).contains(lotto) )
{
prize_count++;
}
}
System.out.println(Math.min(7-prize_count, 6));
}
리스트화할 배열이 int[] 타입이고 key값이 int 타입일 경우 제대로 작동 안할 수 있다.
Arrays.asList()로 배열을 리스트화 할 때 List<T> asList(T...) 메서드의 제네릭스에 int[] 타입이 그대로 전달되어 List<int[]>와 같이 int[] 타입으로 리스트화 되어 버리기 때문이다.
(우리가 원한건 List<int>) 그래서 int[] 배열을 asList<T...>로 리스트화 한 다음 contains(int key)를 수행하게 되어버리면 '{1, 2, 3, 4} == 3'과 같이 배열 자체와 int값이 비교되어버려 무조건 false를 반환한다.
전달 인자 | asList() 기대 반환값 | asList() 실제 반환값 |
int[] array | List<int> | List<int[]> |
Integer[] array | List<Integer> | List<Integer> |
🙏 참조 ::
'Java' 카테고리의 다른 글
[Java] 파일 Zip파일로 압축하여 업로드(암호설정) 구현(zip4j 사용) (0) | 2022.04.26 |
---|---|
[Java] 배열 내 요소 중복여부 체크 (0) | 2022.04.26 |
[Java] 정규식(Regular Expression) (0) | 2022.03.19 |
[Java] 문자열 시분초 -> 초단위로 변환(timeToSec) 구현 (0) | 2021.10.15 |
[Java] 초단위 -> 문자열 시분초로 변환(secToTime) 구현 (0) | 2021.10.15 |