프로그래머스 문제풀이/알고리즘 (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 공부기록