220109_알고리즘

Minseok-Choi·2022년 1월 9일
0

알고리즘

목록 보기
2/13
post-thumbnail

프로그래머스 로또의 최고 순위와 최저 순위

  • level 1 로또의 최고 순위와 최저 순위

  • 이중반복문을 안쓰고 스트림을 사용하려고 해보았다. 이중스트림으로 처리할 수도 있었고, 0을 찾을 때도 스트림을 사용할 수 있었지만, 조금은 더 알아보기 쉽게 코드를 작성하고 싶었다. (마음같이 쉽지 않음,메서드명도 돌아보면 제대로 짓지 못한듯)

  • 그리고 맞춘 갯수와 순위로 변환 할때 단순히 숫자 계산으로도 처리할 수 있지만, Map을 사용해보았다. 너무 간단한 계산이라서 숫자로 계산하는게 더 편한건 맞다.

  • 오늘은 단순히 테스트케이스만 진행했지만, 내일부터는 TDD를 기반으로 알고리즘을 풀어봐야겠다.


import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.Arrays;
import java.util.Map;

public class lottos {
    // 순위 저장
    static Map<Integer, Integer> gradeMap = Map.of(6, 1,
            5, 2,
            4, 3,
            3, 4,
            2, 5,
            1, 6,
            0, 6);

// 답 배열을 찾는 메서드
    static int[] findNums(int[] lottos, int[] winNums) {		
    	
        int zeroCount = 0; // 0갯수 (지워진번호)
        int matchCount = 0; // 맞는 로또번호 갯수
        for (int lotto : lottos) {
            matchCount += (int) Arrays.stream(winNums).filter(winNum -> winNum == lotto).count();
            if (lotto == 0) {
                zeroCount++;
            }
        }
        // {최고 순위, 최저 순위}
        return new int[]{findGrade(matchCount + zeroCount), findGrade(matchCount)};
    }
	// 맞춘 갯수로 순위 찾아내기
    static int findGrade(int count) {
        int grade = gradeMap.get(count);
        return grade;
    }

    @Test
    void test1() {
        int[] lottos = {44, 1, 0, 0, 31, 25};
        int[] nums = {31, 10, 45, 1, 6, 19};
        Assertions.assertArrayEquals(findNums(lottos, nums), new int[]{3, 5});
    }

    @Test
    void test2() {
        int[] lottos = {0, 0, 0, 0, 0, 0};
        int[] nums = {38, 19, 20, 40, 15, 25};
        Assertions.assertArrayEquals(findNums(lottos, nums), new int[]{1, 6});
    }

    @Test
    void test3() {
        int[] lottos = {45, 4, 35, 20, 3, 9};
        int[] nums = {20, 9, 3, 45, 4, 35};
        Assertions.assertArrayEquals(findNums(lottos, nums), new int[]{1, 1});
    }

}
profile
차곡차곡

0개의 댓글