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

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

남건욱 2023. 10. 19. 19:23

목차

    반응형
    188. 주사위 게임 3

    문제

    import java.util.*;
    
    class Solution {
        public int solution(int a, int b, int c, int d) {
            int answer = 0;
            int equals = 1;
            int[] numbers = new int[4];
            
            numbers[0] = a;
            numbers[1] = b;
            numbers[2] = c;
            numbers[3] = d;
            
            Arrays.sort(numbers);
            
            int[] dice = new int[6];
            for(int i=0; i<4; i++){
                dice[numbers[i]-1]++;
            }
            
            for(int i=0; i<6; i++){
                if(dice[i] == 4){
                    answer = 1111 * (i+1);
                    break;
                } else if(dice[i] == 3){
                    for(int j=0; j<6; j++){
                        if(dice[j] == 1){
                            answer = (10 * (i+1) + (j+1)) * (10 * (i+1) + (j+1));
                            break;
                        }
                            
                    }
                } else if(dice[i] == 2){
                    for(int j=0; j<6; j++){
                        if(dice[j] == 2){
                            if(i==j){
                                continue;
                            } else{
                                answer = (i+1 + j+1) * Math.abs((i+1) - (j+1));
                                break;
                            }
                        } else if(dice[j] == 1){
                            equals = equals * (j+1);
                        }
                    } if(equals != 1){
                        answer = equals;
                    }
                } else if(numbers[0] != numbers[1] && numbers[1] != numbers[2] &&
                          numbers[2] != numbers[3]){
                    answer = numbers[0];
                }
            }
            
    
            return answer;
        }
    }

    <작성한 코드>

    두 개의 주사위가 같을 때 곱을 저장하는 역할을 하기 위해 생성하고 1을 대입해 줬다. 그 뒤 int형 배열 numbers에 a, b, c, d의 값을 차례대로 넣어주고 Arrays.sort를 이용해서 오름차순 정렬을 시켜줬다. 그 뒤 dice에 길이를 6만큼 선언한 뒤 numbers [i-1] 즉 주사위의 값을 가진 인덱스에 ++를 해줬다. 그다음 for문을 사용해서 조건을 정리해 줬다. 만약 4개가 같은 수이면 dice [i] 값이 4인값 1개와 나머지는 0으로 채워져 있을 거다. dice의 값이 4인 게 있으면 1111 * (i+1)을 해주고 for문을 멈춘다. 4가 아니라 3 일시에는 숫자가 다른 1개의 값을 찾는다. 찾아서 조건에 맞춰 값을 answer에 넣어주고 for문을 멈춘다. 만약 2개의 값이 같다면 숫자가 다른 두 값을 구해야 한다. dice가 2일 때는 i=j가 같을 때 반복문을 다시 실행하도록 했고, dice [j]가 1이라면 그 값을 equals에 곱해준다. 만약 아니라면 dice가 2개가 같은 값일 때의 조건에 맞는 값을 answer에 넣어주고 반복문을 종료시켰다. 마지막으로 equals이 1이 아니라면 answer에 equals값을 대입해 줬다. 값이 모두 다를 때는 answer에 네 개의 값 중 아무거나 넣으면 된다. 난 0번째 값을 넣어줬다. 마지막으로 answer을 반환해 줬다

     

     

     

    189. 간단한 논리연산

    문제

    class Solution {
        public boolean solution(boolean x1, boolean x2, boolean x3, boolean x4) {
            boolean answer = true;
            
            answer = ((x1 || x2) && (x3 || x4));
            
            return answer;
        }
    }

    <작성한 코드>

    간단한 문제였다. x1, x2는 or연산을 해주고 x3과 x4도 or연산을 해준 뒤 두 값을 앤드연산으로 비교해 주고 answer에 대입해 줬다.

     

     

     

    190. 배열 만들기 4

    문제

    import java.util.*;
    
    class Solution {
        public int[] solution(int[] arr) {
            List<Integer> list = new ArrayList<>();
            int i = 0;
            
            while(arr.length > i){
                if(list.size() == 0){
                    list.add(arr[i]);
                    i++;
                } else{
                    if(list.get(list.size()-1) < arr[i]){
                        list.add(arr[i]);
                        i++;
                    }else{
                        list.remove(list.size()-1);
                    }
                }   
            }
            
            int[] stk = new int[list.size()];
            for(int j=0; j<list.size(); j++){
                stk[j] = list.get(j);
            }
            
            return stk;
        }
    }

    <작성한 코드>

    list를 하나 만들어줬다. 그리고 while문을 사용해서 arr의 길이가 i보다 크면 반복하도록 했다. 우선 list의 길이가 0이면 list에 arr [i]를 더해주고 i++를 해줬다. 만약 길이가 0이 아니라면 else내부의 if, else문이 실행된다. list의 마지막 원소값이 arr [i]보다 작다면 list에 arr [i] 값을 추가해 줬다. 만약 작지 않고 크거나 같다면 list의 마지막원소를 제거해 줬다. 그 뒤 정수형 배열 stk를 list의 길이만큼 선언해 준 뒤 list의 값을 넣어주고 반환하였다.

     

     

     

    191. 콜라츠 수열 만들기

    문제

    import java.util.*;
    
    class Solution {
        public int[] solution(int n) {
            List<Integer> list = new ArrayList<>();
            list.add(n);
            
            while(n != 1){
                if(n%2 == 0){
                    n = n/2;
                } else{
                    n = 3 * n + 1;
                }
                list.add(n);
            }
            
            int[] answer = new int[list.size()];
            for(int i=0; i<list.size(); i++){
                answer[i] = list.get(i);
            }
            
            
            return answer;
        }
    }

    <작성한 코드>

    리스트 하나를 만들어준 뒤 처음값도 포함해야 하니 list.add(n)을 해주고 while문을 시작했다. 짝수라면 n/2 홀수라면 3n+1을 해주고 그 값들을 차례차례 list에 넣어줬다. 그 뒤 n이 1이 되면 while문은 종료된다. 그 뒤 for문으로 list의 값들을 answer에 대입해 주면 끝난다.

     

     

     

    192. 카운트 업

    문제

    class Solution {
        public int[] solution(int start_num, int end_num) {
            int[] answer = new int[end_num - start_num + 1];
            
            for(int i=0; i<answer.length; i++){
                answer[i] = i+start_num;
            }
            
            return answer;
        }
    }

    <작성한 코드>

    간단한 문제였다. answer의 길이를 선언해 주고 answer에 길이만큼 반복문을 돌린 뒤 answer [i] 내부에 i+start_num 값을 넣어주고 반환하였다.

     

     

     

    193. 배열 만들기 2

    문제

    import java.util.*;
    
    class Solution {
        public int[] solution(int l, int r) {
            List<Integer> list = new ArrayList<>();
            
            for(int i=l; i<=r; i++){
                String str = Integer.toString(i);
                if(str.matches("[05]+")){
                    list.add(i);
                }
            }
            
            if(list.size() == 0){
                return new int[]{-1};
            }
            
            int[] answer = new int[list.size()];
            for(int i=0; i<list.size(); i++){
                answer[i] = list.get(i);
            }
            
            return answer;
        }
    }

    <작성한 코드>

    list를 하나 만들어줬다. 그 뒤 l부터 r까지 반복해 주고 i를 문자열로 변환하였다. 그 뒤 정규 표현식으로 0,5로만 이루어진 수를 만나면 list에 추가해 줬다. for문이 끝난 뒤 list의 길이가 0이면 -1을 반환한다. 0이 아니라면 answer에 list의 값들을 넣어주고 반환하였다.

     

     

     

    194. 수열과 구간 쿼리 4

    문제

    class Solution {
        public int[] solution(int[] arr, int[][] queries) {
    
            for(int i=0; i<queries.length; i++){
                int s = queries[i][0];
                int e = queries[i][1];
                int k = queries[i][2];
                
                for(int j=s; j<=e; j++){
                    if(j%k == 0) arr[j]++;
                }
            }          
            
            return arr;
        }
    }

    <작성한 코드>

    간단한 문제다. 중첩 for문을 사용하였고 첫 for문에서는 queries의 길이만큼 반복해 준다. s, e, k에 각각 맞는 값을 대입해 준 뒤 j는 s부터 e까지 반복시켰다. 내부에서는 if문을 사용해서 j% k==0일 때 즉 j가 k의 배수일 때 arr [j]에 +1을 해주고 arr를 반환하였다.

     

     

     

    195. 수열과 구간 쿼리 2

    문제

    import java.util.*;
    
    class Solution {
        public int[] solution(int[] arr, int[][] queries) {
            int[] answer = new int[queries.length];
            Arrays.fill(answer, Integer.MAX_VALUE);
            
            for(int i=0; i<queries.length; i++){
                for(int j=queries[i][0]; j<=queries[i][1]; j++){
                    if(arr[j] > queries[i][2]){
                        answer[i] = Math.min(answer[i], arr[j]);
                    }
                }
                if(answer[i] == Integer.MAX_VALUE) answer[i] = -1;
            }
            
            return answer;
        }
    }

    <작성한 코드>

    answer배열의 길이를 queries의 길이만큼 선언해 준 뒤 Arrays.fill을 사용해서 answer의 모든 원소를 max_value로 설정해 주었다. 그 뒤 반복문으로 queries의 길이만큼 반복시켜 주고 내부에서는 queries의 [i][0] 번째부터 [i][1] 번째까지 반복해 줬다. 만약 arr [j]의 값이 queries [i][2]의 값보다 크다면 answer [i]에 answer [i]와 arr [j] 중 작은 것을 대입한다. 반복된다면 queries [i][2]보다 큰 arr [j]의 값들 중 가장 작은 값이 answer [i]에 넣어질 것이다. 그 뒤 if문에서는 아무 값도 들어가지 않아 값이 초기값 그대로인 Integer.MAX_VALUE이면 answer [i]에는 -1을 넣어줬다.

     

     

     

    196. 수열과 구간 쿼리 3

    문제

    class Solution {
        public int[] solution(int[] arr, int[][] queries) {
            
            for(int i=0; i<queries.length; i++){
                int temp = arr[queries[i][0]];
                arr[queries[i][0]] = arr[queries[i][1]];
                arr[queries[i][1]] = temp;
            }
            
            return arr;
        }
    }

    <작성한 코드>

    간단한 문제였다. 자리만 바꿔주면 되니 temp를 사용해서 인덱스에 들어있는 값을 변경해 줬다.

    반응형
    프로필사진

    남건욱's 공부기록