오늘은 숫자 야구 게임 프로젝트를 진행하면서 겪은 두 가지 트러블슈팅 사례를 기록하고자 한다. 타입 선택(long vs int)와 자료구조의 선택(Set vs List)에 대한 고민과 해결책을 다뤄보겠다.
스트라이크와 볼의 개수를 계산할 때, 스트림(Stream)을 사용하여 개수를 카운트하는 로직을 작성했다. 하지만, count()
메서드가 반환하는 타입이 long
이라는 점을 간과하고, int
로 변수를 선언하면서 타입 불일치 오류가 발생했다.
count()
메서드는 기본적으로 long
타입을 반환하므로, 이를 처리하려면 long
변수로 선언하는 것이 자연스럽고 오류 없이 처리할 수 있다.int
로 강제 변환할 수도 있지만, long
을 사용하는 것이 더 명확하고 적합하다는 결론을 내렸다.long strikes = IntStream.range(0, 3)
.filter(i -> inputList.get(i).equals(answerList.get(i)))
.count();
long balls = IntStream.range(0, 3)
.filter(i -> answerList.contains(inputList.get(i)) && !inputList.get(i).equals(answerList.get(i)))
.count();
결국 long
타입을 사용하는 것이 타입 불일치 오류 없이 처리할 수 있는 방법이었다. 스트림의 반환 타입에 맞는 자료형을 사용하는 것이 중요하다는 점을 다시 확인했다.
숫자 야구 게임에서 유저의 입력과 정답을 비교하여 스트라이크와 볼을 계산하는 로직을 작성하던 중, 정답이 [3, 7, 8]
이고 유저가 283
을 입력했을 때 잘못된 결과로 1 스트라이크, 1 볼
이 출력되었다.
입력값과 정답을 Set
으로 처리하고 있었는데, Set은 순서를 보장하지 않는 자료구조이다. 따라서 유저가 283
을 입력했을 때 Set
에 의해 순서가 변경되었고, 그 결과 잘못된 인덱스 비교가 발생해 예상과 다른 결과가 출력된 것이었다.
정답과 입력값을 비교할 때 순서를 유지해야 했기 때문에, Set 대신 List를 사용하기로 했다. List는 순서를 보장하므로, 입력된 값의 순서대로 비교가 가능했다.
List<Integer> inputList = new ArrayList<>(); // 입력값 저장을 위한 리스트
// 입력값 검증 로직
protected String validateInput(int input, List<Integer> inputList) {
inputList.clear(); // 기존 입력값 초기화
if (input < 100 || input > 999) {
return "세자리x"; // 세 자리 숫자가 아닌 경우
}
inputList.add(input / 100); // 백의 자리
inputList.add((input / 10) % 10); // 십의 자리
inputList.add(input % 10); // 일의 자리
if (new HashSet<>(inputList).size() < 3) {
return "중복"; // 중복된 숫자가 있는 경우
}
return "정상";
}
입력값을 List
로 처리하여, 순서를 보장하고 정확한 인덱스 비교가 가능해졌다. 순서가 중요한 상황에서는 Set 대신 List를 사용하는 것이 적합하다는 점을 배웠다.