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

문제 풀이 (JAVA)

import java.util.*;
public class Solution {
    public int[] solution(int []arr) {
        List<Integer> list= new ArrayList<Integer>();
        int cnt=0; // 리스트 인덱스 카운트 변수
        for(int i=0; i<arr.length; i++){
            if(i==0){ // 첫번째 배열은 리스트에 추가한다.
                list.add(arr[i]);
                cnt++;
            }
            if(i>=1 && list.get(cnt-1).equals(arr[i]) != true){ // 두번째 배열부터 리스트의 들어있는 값과 비교하여 같지 않다면 리스트에 해당 배열을 추가한다.
                list.add(arr[i]);
                cnt++;
            }
        }
        int [] answer= new int[list.size()];
        for(int i=0; i<list.size(); i++){ // 중복제거 된 리스트 출력
            answer[i]=list.get(i);
        }
        return answer;
    }
}

주요 핵심 포인트

1.  리스트가 추가될때마다 cnt 인덱스를 증가시킴으로써 마지막 리스트 인덱스를 찾는다.

2. 마지막 리스트에 저장된 값과 현재 비교중인 배열값이 같지 않다면 리스트에 추가하고 인덱스 카운트를 증가시켰다.

 

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

가운데 글자 가져오기  (0) 2022.04.24
[1차]다트 게임  (0) 2022.04.24
나누어 떨어지는 숫자 배열  (0) 2022.04.24
두 정수 사이의 합  (0) 2022.04.24
문자열 내 마음대로 정렬하기  (0) 2022.04.24

문제 풀이 (JAVA)

import java.util.*;
class Solut ion{
    public int[] solution(int[] arr, int divisor) {
        List<Integer> list = new ArrayList<Integer>();
        for(int i=0; i<arr.length; i++){
            if(arr[i] % divisor == 0){ // 배열의 숫자가 divisor로 나누어떨어진다면
                list.add(arr[i]); // 리스트에 추가한다.
            }   
        }
        if(list.size()<1){ // 리스트가 없다는것은 나누어 떨어지는 값이 없으므로
            int [] answer = new int[1];
            answer[0]=-1; // answer에 -1 배열을 반환한다.
            return answer;
        }
        list.sort(Comparator.naturalOrder()); // 나누어 떨어지는 값을 오름차순으로 정렬한다.
        int [] answer = new int[list.size()];
        for(int i=0; i<answer.length; i++){
            answer[i]=list.get(i); // 정렬된 리스트의 값을 출력 배열에 저장한다.
        }
        return answer;
    }
}

주요 핵심 포인트

1. divisor로 나누어떨어지는 값만 리스트에 저장하였다.

2. 저장된 리스트가 없다면 나누어떨어지는 값이 없으므로 -1을 리턴하였다.

3. 리스트가 존재한다면 오름차순으로 정렬하였다.

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

[1차]다트 게임  (0) 2022.04.24
같은 숫자는 싫어  (0) 2022.04.24
두 정수 사이의 합  (0) 2022.04.24
문자열 내 마음대로 정렬하기  (0) 2022.04.24
문자열 내 p와 y의 개수  (0) 2022.04.17

문제 풀이 (JAVA)

class Solution {
    public long solution(int a, int b) {
        long answer = 0;
        int max= 0;
        int min= 0;
        if(a==b){ // a와 b가 같은 숫자일경우 사이의 숫자가 없으므로 그대로 리턴
            answer+=(long)a;
            return answer;
        }
        max = (a>b) ? a : b; // a가 더 클 경우 max값은 a , 작다면 b
        min = (a<b) ? a : b; // a가 더 작을 경우 min값은 a, 크다면 b 
        for(int i=min; i<=max; i++){ // 두개의 숫자 a,b 사이의 숫자들을 출력값에 더해준다.
            answer += (long)i;         
        }
        
        return answer;
    }
}

주요 핵심 포인트

1.  두 숫자 a ,b 사이의 합을 구해야 한다.

2. 두 숫자에서 작은값과 큰 값을 알아야 하므로 min , max 값을 삼항논리연산자로 풀었다.

+ Recent posts