알고리즘

[프로그래머스] Lv1 문제 풀기 -1

바랄 희 2022. 11. 25. 21:40

아직 자바로 코드를 짜고 알고리즘을 구상하는 것이 어려워서 많이 헤매고 있다..

 

🦊 정수 내림차순으로 배치하기

import java.util.*;

class Solution {
    public long solution(long n) {
        String[] nums = String.valueOf(n).split("");
        Arrays.sort(nums);
        
        StringBuilder sb = new StringBuilder();
        
        for(int i=nums.length-1;i>=0;i--) sb.append(nums[i]);
        
        return Long.parseLong(sb.toString());
    }
}

 

처음에는 n 을 String 으로 바꾸고, charArray 로 바꾸고 해야 하나 싶었는데 이런 방법이 있었다니..!

String.valueOf 로 n의 값을 String 으로 바꾸고 이를 분할해서 nums 라는 배열에 넣는다. 이후 StringBuilder 를 이용해서 거꾸로 문자열을 더했다. 또한 parseInt 로 변환한 후 long 으로 변환해야 하나 했는데 위와 같이 parseLong을 사용할 수 있는 방법이 있다는 것을 미처 생각하지 못했다.

 

🦊 x만큼 간격이 있는 n개의 숫자

class Solution {
    public long[] solution(int x, int n) {
        long[] answer =new long[n];
        answer[0] = x;
        
        for(int i=1;i<n;i++){
            answer[i] = answer[i-1]+x;
        }
        
        return answer;
    }
}

 

🦊 나누어 떨어지는 숫자 배열

내 풀이

class Solution {
    public int[] solution(int[] arr, int divisor) {
        
        List<Integer> answer = new ArrayList<>();
    
        for(int i=0;i<arr.length;i++){
            if(arr[i]%divisor == 0){
                answer.add(arr[i]);
            }
        }
        
        if(answer.size() == 0){
            answer.add(-1);
        }
        Collections.sort(answer);
        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
}

 

모범 풀이

import java.util.Arrays;

class Divisible {
    public int[] divisible(int[] array, int divisor) {
        //ret에 array에 포함된 정수중, divisor로 나누어 떨어지는 숫자를 순서대로 넣으세요.
        return Arrays.stream(array).filter(factor -> factor % divisor == 0).toArray();
    }
    // 아래는 테스트로 출력해 보기 위한 코드입니다.
    public static void main(String[] args) {
        Divisible div = new Divisible();
        int[] array = {5, 9, 7, 10};
        System.out.println( Arrays.toString( div.divisible(array, 5) ));
    }
}

조금은 문제가 개편돼서 일부분은 참고할 수 없지만.. 확실히 filter 를 사용하는 것은 참고할 만한 부분이라고 생각된다.

 

 

🦊 음양 더하기

class Solution {
    public int solution(int[] absolutes, boolean[] signs) {
        int answer = 0;
        
        for(int i=0;i<absolutes.length;i++){
            answer += signs[i] ? absolutes[i] : absolutes[i]*-1;
        }
        
        return answer;
    }
}

삼항 연산자 사용한 점 뿌듯.. 했지만 다른 코드를 참고해봤다. 아래와 같이 개선할 수 있을 것이다.

 

class Solution {
    public int solution(int[] absolutes, boolean[] signs) {
        int answer = 0;
        
        for(int i=0;i<absolutes.length;i++){
            answer += absolutes[i]*(signs[i] ? 1:-1);
        }
        
        return answer;
    }
}

signs 의 여부에 따라 -1 혹은 1을 반환하는 것이다.

 

🦊 없는 숫자 더하기

import java.util.*;

class Solution {
    public int solution(int[] numbers) {
        int ans = Arrays.stream(numbers).sum();
        
        return 45 - ans;
    }
}

나름 효율적으로 잘 풀었다고 생각했는데 더 줄일 수 있겠다.

 

class Solution {
    public int solution(int[] numbers) {
        return 45-Arrays.stream(numbers).sum();
    }
}

 

🦊 가운데 글자 가져오기

import java.util.*;

class Solution {
    public String solution(String s) {
        char[] chars = s.toCharArray();
        
        int index = chars.length/2;
        
        if(chars.length%2==1){
            return Character.toString(chars[index]);
        }
        
        return Character.toString(chars[index-1]) + Character.toString(chars[index]);
    }
}

 

🦊 수박수박수박수박수박수?

class Solution {
    public String solution(int n) {
        String word = "수박";
        
        if(n%2==0){
            return word.repeat(n/2);
        }
        return word.repeat(n/2) + "수";
    }
}

이거 좀 잘푼듯 ✌🏻

 

 

import java.util.*;

class Solution {
    public String solution(String s) {
        String[] ans = String.valueOf(s).split("");
        Arrays.sort(ans,Collections.reverseOrder());
                
        return String.join("", ans);
    }
}

 

🦊 약수의 개수와 덧셈

import java.util.*;

class Solution {
    public boolean isSqaureNumber(int num){
        if(Math.pow((int)Math.sqrt(num), 2) == num){
            return true;
        }
        return false;}
    
    public int solution(int left, int right) {
        int answer = 0;
        
        for(int i=left;i<=right;i++){
            if(isSqaureNumber(i)){
                answer-=i;
                continue;
            }
            answer+=i;
        }
        return answer;
    }
}

제곱수로 약수 홀수인지 짝수인지 확인하는 것에 접근을 성공해서 기분 좋았음..

 

🦊 부족한 금액 계산하기

class Solution {
    public long solution(int price, int money, int count) {
        long sum = count*(price*2+(count-1)*price)/2;
        return money-sum>=0 ? 0:sum-money;
    }
}

일부 테케에서 오류가 뜨는데 왜인지 모르겠다 ...... 다른 분들의 코드를 참고해도 다른 부분을 못찾겠다..