문제



힌트

  • 구매한 번호가 들어있는 배열 lottos와 추첨된 번호가 들어있는 배열 win_nums가 주어집니다.
  • lottos에는 알 수 없는 번호는 0으로 들어가있습니다.
  • lottos에 들어있는 0이 아닌 아이템들과 win_nums를 비교하여 일치하는 아이템이 있으면 win_nums에서 해당 아이템을 제거합니다.
  • 만약 lottos에 들어있는 0 아이템들이 윗 단계에서 win_nums 아이템 중 남은 아이템들과 모두 일치한다면, 최고 등수일 것이고 모두 일치하지 않으면 최저 등수일 것입니다.
    (e.g. win_nums = {1,2,3,4,5,6}, lottos = {1,2,3,0,0,0}  => 최고 등수는 lottos내 0 아이템들이 4,5,6이면 최고 등수. 10,11,12이면 최저 등수임)
  • stream을 사용하면 코드가 단순해질 수 있습니다.

풀이

어떻게 풀지를 찾아보다가 처음으로 stream에 대해 제대로 알아보게 했던 문제였습니다. Stream을 몰라도 푸는데는 큰 문제는 없지만, 단순한 동작을 구현하는 데에는 괜찮은 방법이라는 것을 알게 해 주는 문제였습니다.

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

class Solution {
    public int[] solution(int[] lottos, int[] win_nums) {
		int[] answer = new int[2];
		int equalCnt = 0;
		int unRecognizedNumCnt = 0;

		List<Integer> lottoList = Arrays.stream(lottos).sorted().boxed().collect(Collectors.toList());
		List<Integer> winNumList = Arrays.stream(win_nums).sorted().boxed().collect(Collectors.toList());

		for (int myNum : lottoList) {
			if (myNum == 0) {
				unRecognizedNumCnt += 1;
				continue;
			}

			boolean isEqual = Arrays.stream(win_nums).anyMatch(winNum -> winNum == myNum);

			if (isEqual)
				equalCnt += 1;
		}

		answer[0] = winResult(equalCnt + unRecognizedNumCnt);
		answer[1] = winResult(equalCnt);

		return answer;
	}

	private int winResult(int equalCnt) {
		int result = 0;
		switch (equalCnt) {
		case 6:
			result = 1;
			break;
		case 5:
			result = 2;
			break;
		case 4:
			result = 3;
			break;
		case 3:
			result = 4;
			break;
		case 2:
			result = 5;
			break;
		default:
			result = 6;
		}

		return result;
	}
}

출처
프로그래머스 - lv1 - 로또의 최고 순위와 최저 순위

0개의 댓글