우테코 프리코스 2주차를 마치며

Hyeongjin Song·2022년 11월 9일
0

woowacourse

목록 보기
1/1

*볼과 스트라이크 count 방법

이번 숫자 야구 게임 구현 미션의 핵심인 ball, strike 개수를 어떻게 count할지에 대해서 가장 오래 고민했습니다.

	// 어떻게 ball, strike 개수를 셀 지 만들기 -> 최적화 고민..
    
    for(int i=0;i<3;i++) {
    	if(computerNumberList.get(i) == userNumberList.get(i)) strikeNum++;
    	} // 스트라이크 개수 count
        
    // 볼 개수 count
    if(computerNumberList.get(0) == userNumberList.get(1)) ballNum++;
    if(computerNumberList.get(0) == userNumberList.get(2)) ballNum++;
    if(computerNumberList.get(1) == userNumberList.get(0)) ballNum++;
    if(computerNumberList.get(1) == userNumberList.get(2)) ballNum++;
    if(computerNumberList.get(2) == userNumberList.get(0)) ballNum++;
    if(computerNumberList.get(2) == userNumberList.get(1)) ballNum++;
	...
    ...
    ...
    ...

depth가 2가 넘어서는 안되기에, 2중 for문 안에 if를 삽입할 수 없어 어쩔 수 없이 strike와 ball을 따로 count하는 코드가 완성되었습니다! 하지만, 한눈에 봐도 난잡하고, 최적화가 요구되는 듯 싶었죠.
고민 끝에 떠오른 다른 방법은 다음과 같습니다.

 for(int i=0;i<3;i++) {
    if(computerNumberList.get(i) == userNumberList.get(i)) strikeNum++;
    }

for(int i=0;i<3;i++){
	if(computerNumberList.contains(userNumberList.get(i)) && (computerNumberList.get(i) != userNumberList.get(i))) ballNum++;
	}

이렇게 2개의 for문으로 스트라이크와 볼 각각을 count 하는 코드를 짰습니다. 볼을 count하는 if문은, 유저가 입력한 숫자가 answer 리스트에 존재하면서 + 스트라이크가 아닐 때 볼을 count하게 됩니다.

하지만 눈에 직관적으로 들어오지 않고, 인풋의 숫자가 3개밖에 안되기 때문에 하나하나 검사하는 if문을 6개로 작성한 첫번째 방법으로 최종 결정하게 되었습니다.

그렇지만, 숫자가 더 많아지는 확장 가능성을 고려해볼 때, for문으로 작성한 코드가 더 좋은 코드가 될 수도 있겠다는 생각이 뒤늦게 들었습니다. 기능이 추가되고, 구현하고자 하는 프로그램이 복잡해질수록 확장 가능성을 염두해두고 코드를 짜는 것이 무엇보다 중요하다는 생각이 들었습니다.

*IllegalArgumentException

User가 입력한 숫자 중 '같은 숫자가 있으면 안된다'는 조건을 IllegalArgumentException로 던져야 할지 말아야 할지를 고민했습니다.

User가 바보가 아닌 이상 같은 숫자를 입력할 이유는 없죠. 또한, User의 목표는 3스트라이크이고 이 목표를 달성하기 위해 숫자를 입력하는 것이기에, 정답이 될 확률이 0인 같은 숫자를 최소 2개 이상 포함한 인풋을 User가 입력하는 것은 사실상 '잘못된 입력'으로 보아야 한다는 생각이 먼저 들었습니다.

하지만, 실제 세상의 야구 게임을 생각해보면 다른 결론이 나올 수 있습니다.
실제 야구 게임에서, 같은 숫자를 입력하는 것이 전략적으로 유리할 수 있는 지에 대해서 고민해보면, 제 대답은 '드물지만 가능하다' 입니다.

answer : 312
-> 만약 3 1 까지 알았는데 마지막 자리의 숫자가 2, 5 둘중 하나인데 뭔지는 모르는 상황.. 그렇다면,
if) user input : 555 -> 낫싱 
if) user input : 222 -> 1스트라이크
정답은 312!

숫자 야구게임에 이러한 전략을 사용하려면 경쟁자가 존재해야만 합니다. 그래야만 경쟁자에게 정보를 제공하는 것을 막기 위해 같은 숫자를 사용하는 전략이 의미가 있기 때문이죠.

하지만, 이번 미션은 그렇지 않습니다.
오직 User 1명이 존재하고 경쟁자가 없습니다. 가능한 많은 정보를 통해 빠르게 정답을 찾는 것이 최선의 전략이기 때문에 같은 숫자를 입력하는 것은 '전략적이지 않다'가 문제의 조건에 부합한다고 볼 수 있겠죠.

그렇기에 저는 고민했고, 다음을 근거로 결정을 내렸습니다.

이번 미션에서 '같은 숫자를 입력받는 것이 불가능하다'고 해석될 여지의 조건이 없고, 제가 만든 야구 게임 기능의 확장 가능성을 고려할 때, 실제 야구 게임처럼 최대한 다양한 전략이 적용 가능하도록 구현하는 것이 정답이라고 판단했습니다. 따라서 User가 같은 숫자를 입력하는 것을 IllegalArgumentException로 던지지 않았습니다.
물론 위와 같은 상황에서 315나 312 중 하나를 찍어서 input을 넣는게 낫지 않냐는 반론이 이어질 수 있습니다. 경쟁자가 있는 게임에서는 저와 경쟁자가 번갈아가며 input을 넣기 때문이죠. 그렇다면, 저의 턴을 한번 소모하면서까지 정보를 주지 않는 것이 과연 최선일 수 있는 가에 대해서는 또 고민해봐야 할 문제일 것입니다.

제가 한 고민의 결과가 정답인지 아닌지 잘 모르겠고 이것이 의미있는 고민인지도 잘 모르겠습니다.
하지만 이러한 사소한 결정은 앞으로의 개발 과정에서 수없이 맞닥뜨릴 것이기에, 사소해보이는 것들도 천천히 고민하여 신중하게 결정을 내리는 것을 연습했다는 것만큼은 확실하고, 분명 이를 통해 얻어가는 것이 있을 것이라고 생각합니다.

profile
first in, last out

1개의 댓글

comment-user-thumbnail
2022년 11월 12일

오.. 저는 당연히 중복된 숫자는 예외처리하는게 맞다고생각했는데 이런 관점에서 고민해볼수도 있었겠네요..!! 잘보고갑니다!

답글 달기