String값을 char로 한글자씩 추출할 때 자주 사용
dartScore[i] = dartResult.charAt(i);//문자배열로 추출
문자열 길이로 char 배열 만들기
문자를 문자열로 바꿔서 int 배열에 담기
int[] chance = new int[3];
char[] dartScore = new char[dartResult.length()];//점수를 문자배열로 저장
chance[game] = Integer.parseInt(String.valueOf(dartScore[i - 1]));
어려운 건 아니지만 자주 쓰기 때문에 적어두자.
문자배열 및 인덱스 활용 연습문제
https://programmers.co.kr/learn/courses/30/lessons/17682
코딩테스트 연습 - [1차] 다트 게임
programmers.co.kr
문자배열의 인덱스 및 조건문을 활용하여 풀어내는 문제로 생각하고 진행하였다.
결론은 상당히 오래걸렸다.
처음시작할땐 생각보다 금방 해결했는데, 예상못한 에러로 채점이 진행이 안된다.


디버깅을 해서 하나하나 다 확인을 해봤다. 인텔리제이의 디버깅기능이 이클립스보다 UI가 보기 편하다.

배열의 길이가 6인데 배열의 인덱스를 -1를 찾는 테스트케이스가 들어가 있었나보다.

해결했더니 이번엔 5, 8번의 런타임 에러 2건 빼고는 다 해결된듯 하다. 무슨 문제인지 안알려주는게 굉장히 화나네
삽질에러 해결리스트
1. 첫번째 점수가 10점일 경우를 고려하지 않았음.
-> 조건문을 더 잘게 쪼개서 해결
2. 코드를 손을 댈 수록 원래 2 건의 실패만 나왔던게 점점 실패가 많아진다.
-> 조건문이 많아지면서 괄호의 위치 및 괄호의 EndPoint(? 적절한 용어를 모르겠다)에 맞게 코드가 변경되어야
하는데 값을 저장안하고 조건문이 종료되고, else의 경우에 조건이 실행되어야 하는데 조건이 들어가 있지도
않았다.
=> 결론 : 복잡한 조건문을 더 자주 다뤄야겠다.
통과 코드.
public class DartGame_2018kakao {
public int solution(String dartResult) throws NumberFormatException {
int answer = 0;//정답
final int[] chance = new int[3];//3번 던질때 각 횟수별 점수를 배열로 저장
char[] dartScore = new char[dartResult.length()];//점수를 문자배열로 저장
int game = 0;//횟수별 점수 저장 배열에 들어갈 횟수 인덱스 저장변수
for (int i = 0; i < dartResult.length(); i++) {//ex)10S10D*3T
dartScore[i] = dartResult.charAt(i);//문자배열로 추출
if (dartScore[i] == 'S') {
if (i > 1) {//첫번째 점수가 10점일 경우 인덱스(i)는 2일 때 조건
if (dartScore[i - 1] == '0' && dartScore[i - 2] == '1') {//10S 일 경우 S 앞에 순서대로 1과 0이 만족할 때
chance[game] = 10;// chance[game]에 10점 저장
} else {//아닐 경우는 Single로 S 앞에 숫자를 chance[game]에 저장
chance[game] = Integer.parseInt(String.valueOf(dartScore[i - 1]));
}
game += 1;//chance[game]이 저장되었으니, 2번째 게임 저장값의 인덱스로 만들기 위해 game+1
} else if (i < 2) {//S의 앞이 1자리 점수일때
chance[game] = Integer.parseInt(String.valueOf(dartScore[i - 1]));//chance[game]에 S앞 정수 저장
game += 1;
}
} else if (dartScore[i] == 'D') {
if (i > 1) {
if (dartScore[i - 1] == '0' && dartScore[i - 2] == '1') {
chance[game] = 10 * 10;
} else {
chance[game] = Integer.parseInt(String.valueOf(dartScore[i - 1])) * Integer.parseInt(String.valueOf(dartScore[i - 1]));
}
game += 1;
} else if (i < 2) {
chance[game] = Integer.parseInt(String.valueOf(dartScore[i - 1])) * Integer.parseInt(String.valueOf(dartScore[i - 1]));
game += 1;
}
} else if (dartScore[i] == 'T') {
if (i > 1) {
if (dartScore[i - 1] == '0' && dartScore[i - 2] == '1') {
chance[game] = 10 * 10 * 10;
} else {
chance[game] = Integer.parseInt(String.valueOf(dartScore[i - 1])) * Integer.parseInt(String.valueOf(dartScore[i - 1]))
* Integer.parseInt(String.valueOf(dartScore[i - 1]));
}
game += 1;
} else if (i < 2) {
chance[game] = Integer.parseInt(String.valueOf(dartScore[i - 1])) * Integer.parseInt(String.valueOf(dartScore[i - 1]))
* Integer.parseInt(String.valueOf(dartScore[i - 1]));
game += 1;
}
} else if (dartScore[i] == '*') {//game != 0 이유는? *은 반드시 S or D or T 다음에 나오기 때문에 초기값 1
chance[game - 1] *= 2;//* 이 나오기 전에 S or D or T가 나왔으므로 chance에 저장 후 game에 +1이 되어있기에 game-1해서 X2해줌
if (game > 1) {//*이 2번째 게임 이상 횟수에 나올 경우
chance[game - 2] *= 2;// 전 횟수에도 X2 해줌
}
} else if (dartScore[i] == '#') {
chance[game - 1] *= -1;//-1을 곱해줌
}
}
answer = (int) (chance[0] + chance[1] + chance[2]);
return answer;
}
}
문제 해설 링크가 들어있길래 들어가봤다.
카카오 신입 공채 1차 코딩 테스트 문제 해설
‘블라인드’ 전형으로 실시되어 시작부터 엄청난 화제를 몰고 온 카카오 개발 신입 공채. 그 첫 번째 관문인 1차 코딩 테스트가 지난 9월 16일(토) 오후 2시부터 7시까지 장장 5시간 동안 온라인
tech.kakao.com

???
토큰화와 정규식을 통해서 푸는제 출제 의도 였네..
그나마 위안이 되는건 다른사람들 풀이를 보니 내 60줄짜리 풀이가 긴편이 아니고, 대부분 나처럼 풀었다는 것에 위안을 삼는다.
정규식 공부해서 정규식으로 다시 풀어봐야겠다.
'Back End > JAVA' 카테고리의 다른 글
| [Java] 객체지향 프로그래밍 정리 1 (0) | 2022.05.15 |
|---|---|
| [Java] Stream과 for-loop (0) | 2022.05.11 |
| [Java] int 자료형의 Overflow (5) | 2022.05.11 |
| [Java] int 자료형의 응용(하샤드수) (0) | 2022.05.09 |
| [Java] Annotation (0) | 2022.02.26 |