코딩테스트연습/프로그래머스

[프로그래머스 - JAVA] 로또의 최고 순위와 최저 순위

:)jun 2021. 11. 24. 11:33

https://programmers.co.kr/learn/courses/30/lessons/77484

 

코딩테스트 연습 - 로또의 최고 순위와 최저 순위

로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호

programmers.co.kr

// 테스트코드
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class Quiz1_lottoTest {
    Quiz1_lotto q;

    @BeforeEach
    void setUp() {
        q = new Quiz1_lotto();
    }

    @Test
    void test1() {
        assertArrayEquals(new int[]{3, 5}, q.solution(new int[]{44, 1, 0, 0, 31, 25}, new int[]{31, 10, 45, 1, 6, 19}));
    }

    @Test
    void test2() {
        assertArrayEquals(new int[]{1, 6}, q.solution(new int[]{0, 0, 0, 0, 0, 0}, new int[]{38, 19, 20, 40, 15, 25}));
    }

    @Test
    void test3() {
        assertArrayEquals(new int[]{1, 1}, q.solution(new int[]{45, 4, 35, 20, 3, 9}, new int[]{20, 9, 3, 45, 4, 35}));
    }

}

//프로덕션코드
public class Quiz1_lotto {
    public int[] solution(int[] lottos, int[] win_nums) {
        return checkHighRankAndLowRank(checkNumberOfZero(lottos),checkCorrectNumber(lottos,win_nums));
    }

    private int[] checkHighRankAndLowRank(int numberOfZero, int numberOfCorrect) {
        return new int[]{rank(numberOfZero+numberOfCorrect),rank(numberOfCorrect)};
    }

    private int checkNumberOfZero(int[] lottos) {
        int cnt = 0;
        for (int i = 0; i < lottos.length; i++) {
            if (lottos[i] == 0) {
                cnt++;
            }
        }
        return cnt;
    }

    private int checkCorrectNumber(int[] lottos, int[] win_nums) {
        int cnt = 0;
        for (int i = 0; i < lottos.length; i++) {
            for (int j = 0; j < win_nums.length; j++) {
                if (lottos[i] == win_nums[j]) {
                    cnt++;
                }
            }
        }
        return cnt;
    }

    private int rank(int n) {
        switch (n) {
            case 6:
                return 1;
            case 5:
                return 2;
            case 4:
                return 3;
            case 3:
                return 4;
            case 2:
                return 5;
            default:
                return 6;
        }

    }
}
// 성공! 처음 보는 사람도 읽기 쉽도록 리팩토링 해보자!


// 프로덕션코드
    public int[] solution(int[] lottos, int[] win_nums) {
        return checkHighRankAndLowRank(checkNumberOfZero(lottos), checkNumberOfCorrectNumber(lottos,win_nums));
    }

    private int[] checkHighRankAndLowRank(int numberOfZero, int numberOfCorrect) {
        return new int[]{rank(numberOfZero+numberOfCorrect),rank(numberOfCorrect)};
    }

    private int rank(int n) {
        switch (n) {
            case 6:
                return 1;
            case 5:
                return 2;
            case 4:
                return 3;
            case 3:
                return 4;
            case 2:
                return 5;
            default:
                return 6;
        }

    }

    private int checkNumberOfZero(int[] lottos) {
        int numberOfZero = 0;
        for (int i = 0; i < lottos.length; i++) {
            if (lottos[i] == 0) {
                numberOfZero++;
            }
        }
        return numberOfZero;
    }

    private int checkNumberOfCorrectNumber(int[] lottos, int[] win_nums) {
        int numberOfCorrectNumber = 0;
        for (int i = 0; i < lottos.length; i++) {
            for (int j = 0; j < win_nums.length; j++) {
                if (lottos[i] == win_nums[j]) {
                    numberOfCorrectNumber++;
                }
            }
        }
        return numberOfCorrectNumber;
    }
}

// 클래스 순서를 어떻게 둬야 보기 편할까? 혹시 통상적으로 정한 약속이 있나?
// 리팩토링 책을 빠르게 보고 다시 와서 관련 내용을 추가로 작성하겠다.

아.. 그리고 이제보니까 클래스를 나눈게 아니라 메소드를 나눠놓은거네.....리팩토링 책 완독하는 것을 최우선 목표로 하자.