https://programmers.co.kr/learn/courses/30/lessons/77484
// 테스트코드
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;
}
}
// 클래스 순서를 어떻게 둬야 보기 편할까? 혹시 통상적으로 정한 약속이 있나?
// 리팩토링 책을 빠르게 보고 다시 와서 관련 내용을 추가로 작성하겠다.
아.. 그리고 이제보니까 클래스를 나눈게 아니라 메소드를 나눠놓은거네.....리팩토링 책 완독하는 것을 최우선 목표로 하자.
'코딩테스트연습 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 - JAVA] 완주하지 못한 선수 (0) | 2021.11.27 |
---|---|
[프로그래머스 - JAVA] K번째수 (0) | 2021.11.26 |
[프로그래머스 - JAVA] 소수 찾기 (0) | 2021.11.23 |
[프로그래머스 - JAVA] 직사각형 별찍기 (0) | 2021.11.22 |
[프로그래머스 - JAVA] x만큼 간격이 있는 n개의 숫자 (0) | 2021.11.21 |