[JAVA] 숫자 야구 게임 : 코드스쿼드 코딩테스트

준우·2021년 11월 18일
0

코딩 테스트

목록 보기
2/3
post-thumbnail

코드스쿼드 코딩테스트

코드스쿼드의 2022년 마스터즈 코스에 대기 등록을 해두고 ✉️ 메일로 관련 안내를 받았다.
코드스쿼드는 온라인 및 오프라인 테스트를 진행하고 합격해야 합류할 수 있다고 해서 함께 안내된 예전의 온라인 테스트 문제를 풀어보았다.

숫자 야구 게임

요구사항

예시

프로그래밍 구현 제약사항

제약사항을 모두 지키려고 최대한 노력했으나 우선은 indent depth가 3을 넘지 않도록 하는 것을 목표로 했다.

숫자 야구게임 전체 코드

package codingTest;

import java.util.Scanner;

public class baseBall {
	
	/* 난수 중복 여부 체크 메서드 */
	private static boolean checkNum(int nums[],int index) { 	
		for(int i=0; i<nums.length; i++) {	
			if(nums[i]==index)  {			
				return true;
			}
		} 
			return false;
	}
	
	/* 스트라이크 카운트 메서드 */
	public static int strike(String resultNum, String tryNum, int countStrike){ 
		for(int i=0; i<resultNum.length(); i++) {
			if(resultNum.charAt(i)==tryNum.charAt(i)) {
				countStrike += 1;
			}
		}
		return countStrike;
	}
	
	/* 볼 카운트 메서드 */
	public static int ball(String resultNum, String tryNum, int countBall){
		
		String  strBallCnt 	= "";		
		int 	intBallCnt 	= 0;	
		
		for(int i=0; i<resultNum.length(); i++) {
	
			if (resultNum.indexOf(tryNum.charAt(i))>=0 && resultNum.charAt(i)!=tryNum.charAt(i)) {
				strBallCnt 	+= Integer.toString(i);
				intBallCnt 	=  strBallCnt.length();
				countBall 	=  intBallCnt;
			}
		}
		return countBall;
	}

	/* 중복되지 않는 세자리 난수 생성 */
	public static void main(String[] args) {

		int nums[] = new int[3];	
		int letter = nums.length;
		int index  = 0;			
		int countStrike = 0;
		int countBall 	= 0;
		String secretNum = "";
		String resultNum = "";
		String tryNum 	 = "";
		
		//중복되지 않은 난수만 배열로 저장
		for(int i=0; i<letter; i++) {					
			do {
				index = (int)(Math.random()*10);
				} while (checkNum(nums,index));	 
				nums[i] = index;					 
		}										 
		
		//int형 배열 데이터를 String으로 형변환하여 n자리 난수생성
		for(int i=0; i<letter; i++) {		
			secretNum = Integer.toString(nums[i]);
			resultNum += secretNum; 
		}
		
		/* 게임 시작 */
		for (int i=0; ; i++) { 							
			Scanner sc = new Scanner(System.in);
			System.out.print(letter +"자리 숫자를 입력하세요: ");
			tryNum = sc.next();
			
			int bcnt = ball(resultNum, tryNum, countBall);
			int scnt = strike(resultNum, tryNum, countStrike);
			
			if (tryNum.equals(resultNum)) {
				System.out.println(letter+"스트라이크!");
				System.out.println(resultNum + ", 정답입니다.");
				System.out.println("게임종료");
				break;
			} else if(bcnt>0 && scnt>0 ){
				System.out.println(scnt + "스트라이크 "+ bcnt + "볼");	
			} else if (bcnt>0) {
				System.out.println(bcnt + "볼");	
			} else if (scnt>0) {
				System.out.println(scnt + "스트라이크");		
			} else {
				System.out.println("낫싱");
			}	
		}
	}

}

결과 이미지 (1)

결과 이미지 (2)

느낀 점

이것이 내가 태어나서 처음 해보는 코딩 테스트였다! 퇴근 후 회사 근처 카페에서 문제를 풀었다. "왜 안되는거지?" 🤔 고민하는 시간까지도 통째로 너무 재미있었다. 올해 가장 몰입한 시간이 아니었나 싶다. 문제를 해결하지 못한 채 카페 마감시간이 다 되어 하는 수 없이 집으로 가면서도 나도 모르게 계속 막힌 부분의 코드를 떠올리며 되짚어보고 있었다. 그러다보면 신기하게 "아~!" 💡 하고 깨닫는 순간이 자주 있었다. 그럴때면 1초라도 빨리 당장 책상에 앉아 노트북 💻 을 켜고 싶어진다. 막힌 부분에 너무 잠식되어있기보다 머리에 환기를 시켜주는 것이 더 도움이 된다는 것을 알게 됐다.

아쉬운 점

depth를 최대 2까지만 허용하면서 다른 자리에 같은 수가 있는만큼 n볼을 출력하는 부분은 특히 고민을 많이 했다. 클린 코딩은 둘째 치고 어떻게 구현해야할지 모르겠어서 어려웠다. 볼 출력 외에도 전반적으로 코드를 지금보다 더 간결하게 쓸 수 있는 방법이 있을 것 같은데 아직 모르는 게 많은 것 같다. 맨 처음에는 정상 작동한다는 사실 만으로 만족해 했는데, 내 코드만 보면 우물 안 개구리가 되는 것 같다. 다른 사람들은 어떻게 코딩했는지 찾아 보고 몰랐던 것은 새로 알아가면서 꾸준히 반성하고 자극받으며 공부해야겠다!




코드상 잘못된 부분이 있거나 개선이 필요한 부분은 알려주시면 정말 감사히 듣겠습니다! 🙇🏻‍♀️

0개의 댓글