Back End/JAVA

[Java] 문자배열 인덱스 활용(다트게임 - 프로그래머스 카카오 2018 LV1)

수오니니 2022. 5. 10. 22:54

 

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;
    }
}

 

문제 해설 링크가 들어있길래 들어가봤다. 

 

https://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/#2-%EB%8B%A4%ED%8A%B8-%EA%B2%8C%EC%9E%84%EB%82%9C%EC%9D%B4%EB%8F%84-%ED%95%98

 

카카오 신입 공채 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