https://programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

문제 풀이 (JAVA)

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        for (int i = 0; i < n; i++) {
            answer[i] = Integer.toBinaryString(arr1[i] | arr2[i]); // 비트연산자 '|' 는 OR로 두 숫자를 연산하여 이진수 문자열로 저장한다.
            answer[i] = answer[i].replace('0', ' '); // 이진문자열 0을 공백문자 스페이스로 치환한다.  
            answer[i] = answer[i].replace('1', '#'); // 이진문자열 1을 #으로 치환한다.

            while(answer[i].length() < n) { // 문자열의 길이가 정사각형 길이 n보다 작다면
                answer[i] = ' ' + answer[i]; // 문자열의 길이가 같아질때까지 공백 추가
            }
        }
        return answer;
    }
}

주요 핵심 포인트

1.  비트연산자 OR 를 사용하여 이진문자열로 저장하였다.

2. 문자열의 길이가 N보다 작은 이유는 5의 경우 이진숫자열 101로 저장되기 때문에, N이 5라면 00101로 저장하여야 되기 때문에 문자열의 길이가 같아질때까지 왼쪽에 공백을 추가하여 저장하여야 오류가 발생하지 않는다.

 

리뷰

: toBinaryString을 사용하여 이진문자열로 저장할수 있다는 것을 알았고, 비트연산자를 통해 손쉽게 이진수를 비교하는 방법을 알았다. 이진문자열이 공백을 채워주지 않기 때문에 반복문을 사용해 n개만큼의 공백을 채워줘야 한다는 것을 뒤늦게야 깨달았다. 앞으로 더 노력하자.

'프로그래머스(JAVA)' 카테고리의 다른 글

나머지가 1이 되는 수 찾기  (0) 2022.04.24
부족한 금액 계산하기  (0) 2022.04.24
가운데 글자 가져오기  (0) 2022.04.24
[1차]다트 게임  (0) 2022.04.24
같은 숫자는 싫어  (0) 2022.04.24

https://programmers.co.kr/learn/courses/30/lessons/17682

 

코딩테스트 연습 - [1차] 다트 게임

 

programmers.co.kr

ㄴ 문제가 길어 링크로 대체

문제 풀이 (JAVA)

class Solution {
    public int solution(String dartResult) {
        int answer = 0;
        int [] score = new int[3]; // 스코어를 기록할 배열 선언
        int [] num = new int [3]; // 숫자를 가져올 배열 선언
        int j=0;
        int k=0;
        for(int i=0; i<dartResult.length(); i++){
            char ch = dartResult.charAt(i); // i번째 문자를 가져온다.
            
            if(Character.isDigit(ch)){ // 문자가 0~9사이 숫자라면 true
                if(ch=='1' && dartResult.charAt(i+1)=='0'){ // 10인 숫자를 구하는 논리식
                    num[j++]=10;
                    i++;
                }else{ // 10이 아니라면 숫자로 변환하여 숫자배열에 저장.
                    num[j++] = Character.getNumericValue(ch);
                }
            }else{ // 문자가 숫자가 아니라면 (S,D,T ,*,#)
                switch (ch){
                    case 'S' :
                        score[k++]=(int)Math.pow(num[j-1],1); // num[j-1]은 위에서 숫자를 저장후 j를 증가시키기 때문.
                        break;
                    case 'D' :
                        score[k++]=(int)Math.pow(num[j-1],2);
                        break;
                    case 'T' :
                        score[k++]=(int)Math.pow(num[j-1],3);
                        break;
                    case '*' :
                        if(j==1){ // 첫번째 기록 숫자일경우
                            score[k-1] *=2; // 현재 저장된 스코어만 x2배
                        }else if(j>1){ // 두번째 혹은 세번째 숫자일경우
                            score[k-1] *=2; // 이전 점수 x2배
                            score[k-2] *=2; // 현재 점수 x2배
                        }
                        break;
                    case '#' :
                        score[k-1] *= -1; // 현재 숫자만 -1배
                        break;
                }
            }
        }
        
        for(int i=0; i<score.length; i++){
            answer +=score[i];
            System.out.print(score[i]+",");
        }
        return answer;
    }
}

주요 핵심 포인트

1.  charAt을 사용해 문자열에 저장된 문자가 숫자인지 문자인지를 구별하였다. 

2. Character.isDisit 를 사용해 문자가 숫자인지를 판별하였다.

3. 숫자일 경우 getNumericValue를 사용해 문자를 숫자로 변환하여 저장하였다.

4. 숫자가 아닌경우 S D T 는 Math.pow를 사용해 제곱해주었다.

5. * 인 경우 이전 스코어와 현재 스코어에 *2배를 하였다.

6. #인 경우 현재 스코어에만 -1배를 곱하였다.

 

리뷰

: 카카오 코딩테스트 문제는 아직 제한된 시간내에 풀기에 부족하다는 생각이 들었다.

이 문제를 손쉽게 풀기 위하여 좀 더 많은 노력을 기울여야겠다는 생각을 하였다.

코딩 테스트를 준비하는 모든 분들이 성공하였으면 좋겠다.

 

'프로그래머스(JAVA)' 카테고리의 다른 글

[1차] 비밀지도  (0) 2022.04.24
가운데 글자 가져오기  (0) 2022.04.24
같은 숫자는 싫어  (0) 2022.04.24
나누어 떨어지는 숫자 배열  (0) 2022.04.24
두 정수 사이의 합  (0) 2022.04.24

+ Recent posts