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

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

남건욱 2023. 9. 22. 01:01
반응형
41. 공 던지기

문제

class Solution {
    public int solution(int[] numbers, int k) {
        int answer = 1;
        
        for(int i=1; i<k; i++){
            answer+=2;
            if(answer>numbers.length) answer -= numbers.length;
        }
        
        return answer;
    }
}

<작성한 코드>

던지는 사람은 1번째부터 시작하기 때문에 answer을 1로 초기화해 주었다.

 

 

 

42. 배열 회전시키기

문제

class Solution {
    public int[] solution(int[] numbers, String direction) {
        int[] answer = new int[numbers.length];
        
        if(direction.equals("right")){
            for(int i=0; i<numbers.length - 1; i++){
                answer[i+1] = numbers[i];
            }
            answer[0] = numbers[numbers.length - 1];
        } 
        else if(direction.equals("left")){
            for(int i=0; i<numbers.length - 1; i++){
                answer[i] = numbers[i+1];
            }
            answer[numbers.length - 1] = numbers[0];
        }
        
        return answer;
    }
}

<작성한 코드>

direction이 right, left 둘 중 하나만 나온 다했으니 조건을 두 개로 나눠서 걸었다. 후에 right일 때는 0부터 길이의-1만큼 반복해 주었다. 오른쪽이든 왼쪽이든 첫 번째 값과 마지막값은 따로 설정해줘야 했기 때문이다. 그 후 차례대로 대입해 준 뒤 right면 첫 번째 배열값을 left면 마지막 배열값을 초기화해 주었다.

 

 

43. 주사위의 개수

문제

class Solution {
    public int solution(int[] box, int n) {
        int answer = 1;
        
        for(int i=0; i<box.length; i++){
            answer *= box[i] / n;
        }
        
        return answer;
    }
}

<작성한 코드>

몇 개가 들어갈 수 있는지 생각해 봤다. 가로, 세로, 높이 각각에 나누기 n만큼 해줘서 몫끼리 전부 곱해주면 들어갈 수 있는 개수가 나왔다. 따라서 for문으로 배열의 길이만큼 반복시키고 answer값에 가로, 세로, 높이를 n으로 나눠진 것을 차례로 곱해줬다.

 

 

44. 합성수 찾기

문제

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        for(int i=1; i<=n; i++){
            if(truefalse(i))answer ++;
        }
        
        return answer;
    }
    
    public boolean truefalse(int num){
        int cnt = 0;
        for(int i=1; i<=num; i++){
            if(num%i == 0) cnt++;
        }
        if(cnt >= 3) return true;
        else return false;
    }
}

<작성한 코드>

true/false를 반환하는 truefalse 메서드를 만들어주고 1부터 n번까지 반복해서 실행시켜 주었다. truefalse 안에서는 i를 1부터 n번까지 반복하면서 나머지가 0일 때 즉 약수로 확인되면 cnt을 1씩 추가해 줘서 넘겨받은 num의 약수개수를 구한다. 그리고 cnt가 3 이상이면 true, 미만이면 false를 반환시켰다.

 

 

45. 최댓값 만들기(1)

문제

class Solution {
    public int solution(int[] numbers) {
        int answer = 0;
        int max = 0;
        int max2 = 0;
        
        for(int i=0; i<numbers.length; i++){
            if(numbers[i] >= max){
                max2 = max;
                max = numbers[i];
            } else if(numbers[i] > max2){
                max2 = numbers[i];
            }
        } 
        
        answer = max * max2;
        
        return answer;
    }
}

<작성한 코드>

max가 제일 큰 수 max2가 두 번째로 큰 수로 구해주었다. 반복문으로 0부터 numbers의 길이까지 반복시켜 준다. 내부에서는 만약 각원소 중 max보다 크거나 같은 게 발견된다면 max2에 현재 max값을 넣어주고 max에는 발견한 값을 넣어준다. 그리고 원소의 값 중 max2보다 큰 게 있으면 max2에 그 값을 대입해 준다. 두 개를 곱해준 후 반환해 주었다.

 

 

46. 팩토리얼

문제

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        for(int i=1; i<=n; i++){
            if(factorial(i) <= n){
                answer = i;
            } else{
                break;
            }
        }
        
        return answer;
    }
    
    public int factorial(int n){
        int result = 1;
        for(int i=1; i<=n; i++){
            result *=i;
        }
        return result;
    }
}

<작성한 코드>

factorial역할을 할 메서드 하나를 만들어주었다. 그 후 for문으로 i는 1부터 n번까지 반복되게 했고 만약 제공받은 n보다 작을 때 answer를 계속 초기화시켰다. 결국 마지막에 answer에 담기는 것은 문제에서 요구하는 답이랑 일치한다.

 

 

 

47. 모음제거

문제

class Solution {
    public String solution(String my_string) {
        String answer = "";
        
        for(int i=0; i<my_string.length(); i++){
            if(my_string.charAt(i) == 'a') continue;
            if(my_string.charAt(i) == 'e') continue;
            if(my_string.charAt(i) == 'i') continue;
            if(my_string.charAt(i) == 'o') continue;
            if(my_string.charAt(i) == 'u') continue;
            answer += my_string.charAt(i);
        }
        
        return answer;
    }
}

<작성한 코드>

for문으로 원소의 길이만큼 반복되게 하였다. 안에는 if문으로 a, e, i, o, u 중 하나가 나오면 처음으로 돌아가도록 하였고, 걸리지 않으면 answer에 추가해서 반환하였다.

 

 

48. 문자열 정렬하기(1)

문제

import java.util.*;

class Solution {
    public int[] solution(String my_string) {
        int[] answer = {};
        ArrayList<Integer> list = new ArrayList<>();
        
        for(int i=0; i<my_string.length(); i++){
            if(my_string.charAt(i) >= '0' && my_string.charAt(i) <= '9'){
                list.add(my_string.charAt(i) - '0');
            }
        }
        
        answer = new int[list.size()];
        for(int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }
        
        Arrays.sort(answer);
        
        return answer;
    }
}

<작성한 코드>

문장에서 수만 꺼내담을 list를 하나 만들었다. 그 후 for문으로 0부터 my_string의 길이만큼 반복해 주고 내부에서 조건문을 걸었다. 각 원소가 0에서 9 사이면 list에 하나씩 추가해 줬다. char형으로 나올 거기 때문에 -'0'을 해주어서 본래 숫자로 맞췄다. list가 만들어졌으면 기존의 answer 배열의 길이를 초기화해 주고 list에서 한 개씩 꺼내서 담아주었다. 마지막으로. sort를 사용해서 answer을 오름차순으로 정렬시키고 반환하였다.

 

반응형
프로필사진

남건욱's 공부기록