코드스쿼드의 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초라도 빨리 당장 책상에 앉아 노트북 💻 을 켜고 싶어진다. 막힌 부분에 너무 잠식되어있기보다 머리에 환기를 시켜주는 것이 더 도움이 된다는 것을 알게 됐다.
depth를 최대 2까지만 허용하면서 다른 자리에 같은 수가 있는만큼 n볼을 출력하는 부분은 특히 고민을 많이 했다. 클린 코딩은 둘째 치고 어떻게 구현해야할지 모르겠어서 어려웠다. 볼 출력 외에도 전반적으로 코드를 지금보다 더 간결하게 쓸 수 있는 방법이 있을 것 같은데 아직 모르는 게 많은 것 같다. 맨 처음에는 정상 작동한다는 사실 만으로 만족해 했는데, 내 코드만 보면 우물 안 개구리가 되는 것 같다. 다른 사람들은 어떻게 코딩했는지 찾아 보고 몰랐던 것은 새로 알아가면서 꾸준히 반성하고 자극받으며 공부해야겠다!
코드상 잘못된 부분이 있거나 개선이 필요한 부분은 알려주시면 정말 감사히 듣겠습니다! 🙇🏻♀️