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