프로그래머스 문제풀이/알고리즘 (JAVA)

[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 0 (33~40번 문제풀이)

남건욱 2023. 9. 21. 21:29
반응형
33. 진료순서 정하기

문제

class Solution {
    public int[] solution(int[] emergency) {
        int[] answer = new int[emergency.length];
        
        for(int i=0; i<emergency.length; i++){
            int cnt = 0;
            
            for(int j=0; j<emergency.length; j++){
               if(emergency[j] > emergency[i]){
                   cnt ++;
               }
           }
            answer[i] = cnt+1;
        }
        
        return answer;
    }
}

<작성한 코드>

answer 배열의 길이는 emergency의 길이만큼 선언하였다. 그 후 2중 for문을 만들어주었다. for문이 실행될 때마다 cnt의 수를 초기화시켰고 반복해 가며 i번째보다 j번째의 값이 크면 cnt에 1씩 더해줬다. 이렇게 해주면 나보다 응급도가 높은 수의 개수가 나온다. 여기에 +1을 해주어서 순서를 지정해 주었다.

 

 

 

34. 순서쌍의 개수

문제

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        for(int i=1; i<=n; i++){
            if(n%i == 0){
                answer++;
            }
        }
        
        return answer;
    }
}

<작성한 코드>

for문으로 범위는 1부터 n번째까지 반복시켰다. n% i == 0을 사용하여 i가 n의 약수일 때 answer에 1을 더해주어 약수의 개수를 구해서 리턴하였다. 약수의 개수만큼 순서쌍이 나온다.

 

 

 

35. 개미 군단

문제

class Solution {
    public int solution(int hp) {
        int answer = 0;
        
        answer += hp/5;
        answer += (hp%5)/3;
        answer += ((hp%5)%3)/1;
        
        return answer;
    }
}

<작성한 코드>

넘겨받은 hp에서 가장 큰 공격력부터 나눠서 필요한 마릿수를 더해갔다. 간단한 문제다.

 

 

36. 모스부호(1)

문제

import java.util.HashMap;
class Solution {
    public String solution(String letter) {
        String answer = "";
        StringBuilder answer2 = new StringBuilder();
        
        HashMap<String, Character> morse = new HashMap<String, Character>() {{
            put(".-", 'a'); put("-...", 'b'); put("-.-.", 'c'); put("-..", 'd');
            put(".", 'e'); put("..-.", 'f'); put("--.", 'g'); put("....", 'h');
            put("..", 'i'); put(".---", 'j'); put("-.-", 'k'); put(".-..", 'l');
            put("--", 'm'); put("-.", 'n'); put("---", 'o'); put(".--.", 'p');
            put("--.-", 'q'); put(".-.", 'r'); put("...", 's'); put("-", 't');
            put("..-", 'u'); put("...-", 'v'); put(".--", 'w'); put("-..-", 'x');
            put("-.--", 'y'); put("--..", 'z');
        }};
        
        for(String a : letter.split(" ")){
            answer2.append(morse.get(a));
        }
                               
        return answer2.toString();
    }
}

<작성한 코드>

HashMap을 사용해서 제공된 값을 손수 넣어줬다. 후에 letter의 내용을. split(" ")을 사용해서 공백을 기준으로 하나씩 잘라서 대입했다. morse에 get(받아온 알파벳)을 넣어서 모스부호에 맞는 단어를 answer2에 넣어주었다.

 

 

37. 가위 바위 보

문제

 

class Solution {
    public String solution(String rsp) {
        String answer = "";
        
        for(int i=0; i<rsp.length(); i++){
            if(rsp.charAt(i) == '0'){
                answer += 5;
            } else if(rsp.charAt(i) == '2'){
                answer += 0;
            } else{
                answer += 2;
            } 
        }
        
        return answer;
    }
}

<작성한 코드>

총 3가지 경우의 수에 맞춰 if문을 작성하였다. rsp의 길이만큼 반복해 주면 답을 가지고 있는 answer 문자열을 만들 수 있다.

 

 

38. 구슬을 나누는 경우의 수

문제

import java.math.BigInteger;

class Solution {
    public BigInteger solution(int balls, int share) {
        // 서로다른 n개중 m개를 뽑는 경우의 수 공식 n! / (n-m)! * m!
        BigInteger answer = BigInteger.ZERO;
        
        BigInteger numerator = factorial(balls);
        BigInteger denominator = factorial(balls - share).multiply(factorial(share));

        answer = numerator.divide(denominator);
        
        return answer;
    }
    
    public BigInteger factorial(int number){
        BigInteger result = BigInteger.ONE;
        for (int i = number; i >= 1; i--) {
            result = result.multiply(BigInteger.valueOf(i));
        }
        
        return result;
    }
    
}

<작성한 코드>

기존에 long형으로 작성을 하였으나 자꾸 특정 테스트 결과가 통과가 안 됐다. 생각해 보니 들어올 수 있는 최대경우의 수가 30!인데 30! 은 long형으로도 담을 수가 없었다. 그래서 BigInteger형으로 바꿔서 사용하였다. 공식에다가 그대로 대입만 해주었다. 문제설명이 살짝 아쉬웠던 게 아닌가 싶은 문제였다.

 

 

39. 점의 위치 구하기

문제

class Solution {
    public int solution(int[] dot) {
        int answer = 0;
        
        if(dot[0] > 0){
            if(dot[1] > 0){
                answer = 1;
            }else {
                answer = 4;
            }
        }
        
        if(dot[0] < 0){
            if(dot[1] >0){
                answer = 2;
            }else {
                answer = 3;
            }
        }
        return answer;
    }
}

<작성한 코드>

x좌표가 0보다 클 때, 작을때로 한번 나눴고 내부에서 y좌표가 0보다 클때, 작을 때의 조건문을 넣어서 값에 맞는 1, 2, 3, 4분면으로 반환해 주었다.

 

 

40. 2차원으로 만들기

문제

class Solution {
    public int[][] solution(int[] num_list, int n) {
        int listLength = num_list.length / n;
        int[][] answer = new int[listLength][n];
        int cnt = 0;
        
        for(int i=0; i<listLength; i++){
            for(int j=0; j<n; j++){
                answer[i][j] = num_list[cnt];
                cnt++;
            }
        }
        
        return answer;
    }
}

<작성한 코드>

listLength에 반복해야 할 수를 구해줬다. 후에 2차원배열의 길이를 int [listLength][n]을 해줘서 요구사항에 딱 맞는 배열을 선언했다. num_list에서 꺼내올 위치를 지정해 줄 cnt변수를 만들고 반복문으로 차례대로 값을 대입해 주고 반환했다.

반응형
프로필사진

남건욱's 공부기록