항상 관심 있었던 코드 스쿼드에서 마스터스 코스 안내 메일이 왔다.
처음 코딩을 시작할 때부터 코드 스쿼드의 마스터스 코스를 지원하고 싶었는데
금전적인 문제도 있고, 그 당시에 나에게는 모집 테스트의 난이도가 너무 높았기에 포기했었다.
올해 취업을 준비하면서 내가 부족하다는 사실을 뼈저리게 느껴 내년 마스터스 코스를 합류를 생각하고 있다.
물론 모집 테스트에 통과해야겠지만...
올해 입사 지원과 함께 여러 부트캠프도 지원했었지만 코딩 테스트에서 광탈했기에 마스터스 코스는 가능할까 생각이 들었다. 나 같은 사람을 위해서 숫자 야구 게임이라는 문제를 공개했길래 한번 풀어보았다.
숫자 야구 문제는 예전에 박재성 님의 TDD 강의 후기에 대해 알아보다가 본 것 같은데 그때는 풀어볼 생각도 못했었다.
문제 링크 : https://github.com/code-squad/test-item-pool/blob/master/level2-common/level2.md
문제의 제한 시간이 하루나 이틀이라는 것을 보고 얼마나 어렵길래 시간을 이렇게 많이 주는 걸까 생각하며 문제를 읽었다.
그런데 문제를 읽었을 때는 생각보다는 간단하다는 느낌이 들었다. 1시간이면 풀겠다 싶어 바로 풀어보았는데 4시간이 걸렸다. 몇 번이고 머리를 부여잡으며 건방진 생각을 했구나라고 되뇌었다....
문제는 간단하지만 제약 사항이 까다롭다. 코드 라인을 줄이려고 하면 들여 쓰기의 depth가 깊어지고 depth를 낮추려고 하면 코드 라인이 길어지곤 했다. 힌트에 최대한 메서드를 분리해보라고 했는데 평소에는 이렇게 많이 메서드를 분리해본 적도 없어 풀면서 몇 번이고 구조를 바꿨다. 전역 변수를 사용하지 못하는 것도 어려웠는데 메서드 호출과 반환에 대해서 계속 생각해야 했기 때문이다.
마지막에 output 메서드를 2개로 분리했는데 라인 제한을 맞추려면 다른 방법이 생각나지 않아서 분리했다.
메서드 개수에 대한 제한은 없으니 분리해도 되겠다 싶었는데 그다지 마음에 들지는 않는다.
전체적인 코드도 로직이 깔끔하지 못한 것 같아서 리팩터링이 필요할 것 같다.
최종 코드
package Code_squad;
// 문제 링크 : https://github.com/code-squad/test-item-pool/blob/master/level2-common/level2.md
import java.util.*;
public class NumberBaseball {
// 메인 메서드
// 2라인 depth 0
public static void main(String[] args) {
// 숫자 메서드 호출
String n = makeNum();
// 테스트를 위해 n 출력
System.out.println(n);
// 입력 메서드 호출
input(n);
}
// 컴퓨터가 만들 숫자를 정하는 메서드
// 10라인, depth 1
static String makeNum() {
Set<String> set = new HashSet<>();
// 1부터 9까지 랜덤 생성후 set에 섭압
while (set.size() < 3) {
// 정수범위 지정 : (int) Math.random() * (최댓값-최소값+1) + 최소값
String temp = String.valueOf((int) (Math.random() * 7 + 1));
set.add(temp);
}
// set을 String으로 변환
String n = "";
for (String s : set) {
n += s;
}
return n;
}
// 시용자 입력 메서드
// 9라인 depth 1
static void input(String n) {
// 사용자 입력
Scanner sc = new Scanner(System.in);
// 사용자가 정답을 맞출때까지 무한반복
String answer = "";
while (!n.equals(answer)) {
System.out.print("숫자를 입력해주세요 ex)123 : ");
String input = sc.next();
count(input, n);
answer = input;
}
sc.close();
}
// 스트라이크와 볼 개수를 세는 메서드
// 8라인 depth 2
static void count(String input, String n) {
String[] convertTemp = input.split("");
int strike = 0, ball = 0;
// strike 개수와 ball 개수 카운트
for (int i = 0; i < input.length(); i++) {
// 각 자리수 비교 메서드 호출
int result = check(convertTemp[i], i, n);
if(result == 1) strike++;
if(result == 2) ball++;
}
// 출력 메서드 호출
output(strike, ball);
}
// n과 input의 각 자리수를 비교하는 메서드
// 10라인 depth 2
static int check(String input, int idx, String n) {
int result = 0;
String[] checkTemp = n.split("");
// input의 idx가 n에 포함되는지
if (n.contains(input)) {
// idx가 맞는지
if (checkTemp[idx].equals(input)) {
result = 1;
return result;
}
result = 2;
}
return result;
}
// 결과와 힌트를 출력하는 메서드
// 9라인 depth 1
static void output(int strike, int ball) {
if(strike == 0 && ball == 0) {
System.out.println("낫싱");
return;
}
if(strike == 3) {
System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
return;
}
// 상세 비교가 필요하다면 subOutput 메서드 호출
subOutput(strike, ball);
}
// 조건 상세 비교후 힌트 출력 메서드
// 9라인 depth 1
static void subOutput(int strike, int ball) {
if(strike > 0 && ball > 0) {
System.out.println(strike + " 스트라이크 " + ball + "볼");
}
if(strike == 0 && ball != 0) {
System.out.println(ball + "볼");
}
if(strike != 0 && ball == 0) {
System.out.println(strike + " 스트라이크");
}
}
}
테스트 수행 결과
'코딩 테스트' 카테고리의 다른 글
(Java) 프로그래머스 - 2개 이하로 다른 비트 (0) | 2022.09.06 |
---|---|
(Java) 프로그래머스 - 파일명 정렬 (0) | 2022.09.04 |
(Java) 프로그래머스 - 프렌즈4블록 (0) | 2022.09.01 |
(Java) 프로그래머스 - 두 큐 합 같게 만들기 (0) | 2022.09.01 |
(Java) 프로그래머스 - k진수에서 소수 개수 구하기 (0) | 2022.08.31 |