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