241024 개인과제2 트러블슈팅

물고기가자라면어그로·2024년 10월 25일
0
post-thumbnail

드디어 두 번째 과제를 마쳤다. 두 번째 과제는 숫자야구 게임이었는데 프로그램이 랜덤으로 생성한 숫자를 답을 입력할 때마다 힌트를 받아가며 맞추는 게임이다.
저번 과제 때는 필수 구현 기능만 만들 수 있었는데 이번에는 도전 기능들까지 구현하는데에 성공했다.

구현 기능(배경)

  1. 시작 메뉴 (게임시작/게임기록 확인/게임종료)
  2. 게임시작 시 난이도 조정(맞출 숫자 자릿수 설정 가능 3/4/5)
  3. 게임 시작 시 난이도에 맞춰 랜덤한 자릿수의 숫자를 생성(중복X)
  4. 플레이어에게 숫자를 입력받아(중복X) 각 자리의 수가 생성된 랜덤숫자와 숫자와 자리가 일치하는지 비교하고 세 가지 결과로 분류 (strike, ball, out)
  5. 스트라이크가 3개면 플레이어가 정답을 맞추며 게임이 종료 되고 그렇지 않다면 스트라이크, 볼, 아웃의 개수를 힌트로 제시.
  6. 게임 한 라운드가 끝날 때마다 1의 시작메뉴가 반복적으로 제시됨.
  7. 라운드 별 입력 시도횟수가 저장되어 조회가능.
  8. 요구하는 조건에 맞지 않는 값(예외)을 입력시 예외처리(메세지 출력, 재입력 요구)

트러블슈팅

1. 발단

숫자 야구 게임에서 랜덤숫자를 생성하고 입력받은 숫자를 비교하는 코드를 전부 짰는데 비교하는 과정에서 오류가 나는지 특정상황에서 잘못된 힌트들이 출력되기 시작했다.

예를 들어 생성된 숫자가 [3, 4, 5] 이고 입력한 숫자가 [5, 1, 4]라면 자리는 일치하지 않지만 숫자는 일치하는 숫자가 2개(5와 4), 숫자도 자리도 일치하지 않는 숫자가 1개(1)여서 ball 2개와 out 1개가 떠야 정상이다. 그러나 strike 2개와 out 1개가 떴다.

2. 전개

저장된 숫자나 입력된 숫자가 중간에 바뀌기때문에 결과가 바뀌는 것일테니 무엇이 문제인지 확인하기 위해 로직이 진행됨에 따라 중간중간 생성숫자와 입력숫자를 출력하며 결과를 확인해 보았다.

무작위로 숫자가 바뀌거나 잘못된 힌트가 출력되는 것이 아니라 입력된 숫자가 입력된 순서가 아닌 숫자의 크기대로 정렬되어 저장된 것이 확인되었다.

3. 위기

입력된 숫자가 저장되는 부분을 확인해 보니

  1. 숫자를 String으로 받아 char로 형변환하여 자리순서대로 분리하여 저장
  2. 중복을 확인하기 위해 HashSet에 넣음
  3. 랜덤으로 생성된 숫자의 각각의 자릿수를 비교하기 위해 이 HashSet을 ArrayList로 변환

Stringcharacter로 형변환하기 위해 처음 써 본 charAt() 함수때문일까 싶어 검색해보고 마찬가지로 HashSetList로 바꾸는 식이 잘못되었나 싶어 차근차근 뜯어보았으나 문제가 될 부분은 없어보였다.

4. 절정

아무리 생각해도 문제가 될 만한 부분은 숫자들을 HashSet에 넣고 이것이 List로 변환되는 과정이었는데 생각해보니 원인은 HashSet에 있었다.
중복인 숫자들을 체크하기 위해 중복을 허용하지 않는 콜렉션 Set에 넣는다는 것에만 집중해 Set이 입력 순서를 무시한다는 속성을 가진 것을 잊어버린 것이다. 따라서 입력 순서를 그대로 가져가주는 특수한 SetLinkedHashSet을 사용해주기로 했다.

5. 결말

입력한 숫자들이 자리에 맞게 ArrayList에 최종 저장되는 것을 확인 할 수 있었다. 그리고 숫자와 자리를 비교해 출력되는 힌트도 정상적으로 출력되었다.

Set는 기본적으로 중복을 허용하지 않지만 입력순서를 무시하는 단순집합의 성질을 가진다는 것을 잊지말아야겠다. 입력한 순서의 속성을 그대로 살리고 싶다면 LinkedHashSet를 이용하자.

마무리

이번에 진행된 트러블슈팅의 요약은 다음과 같다.

  1. 입력받은 숫자를 프로그램에서 랜덤생성한 숫자와 비교했을때의 결과값이 실제와 다르게 출력되고 있었다.
  2. 입력받은 숫자는 저장될 때 중복숫자를 걸러내기 위해 HashSet에 들어가고 있었다.
  3. HashSet는 입력 순서를 무시하는 단순 집합의 성질을 가지고 있기 때문에 숫자들이 입력순서와 상관없이 숫자의 크기대로 정렬되어 있었고 이것이 그대로 ArrayList로 형변환 되었다.
  4. HashSetLinkedHashSet으로 바꾸어 입력순서대로 저장되도록 하였다.

0개의 댓글