Java

[프로그래머스] 03/24 문제 풀기

openDeveloper 2023. 3. 24. 22:19

프로그래머스 : 예산

 

https://school.programmers.co.kr/learn/courses/30/lessons/12982

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 접근법 : 최대한 많은 부서가 지원을 받아야 하므로, sort한 처음부터 하나씩 예산에서 빼주면서 cnt를 올린다.

 

import java.util.Arrays;
class Solution {
    public int solution(int[] d, int budget) {
        int answer = 0;
        Arrays.sort(d);
        for(int dot : d){
            if(dot > budget){
                break;
            }
            budget -= dot;
            answer++;
        }        
        return answer;
    }
}

 

프로그래머스 : 시저 암호

 

https://school.programmers.co.kr/learn/courses/30/lessons/12926

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 접근법 : 처음에는 단순하게 char형 변수에 +n 만큼해주려고 하였는데, 생각해보니 a~z , A~Z 아스키코드 값이 다르고 값을 벗어날 경우가 생겨 소문자 배열, 대문자 배열을 각각 만들어 값을 벗어날 경우를 생각하여 % 로 연산해주어 해결하였다.

 

class Solution {
    public String solution(String s, int n) {
        String answer = "";
        StringBuilder sb = new StringBuilder();
        char[] lcAp = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
        char[] hiAp = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
        
        for(char c : s.toCharArray())
        {
            if(c >= 'a' && c <= 'z') {
                sb.append(lcAp[(c-'a'+n) % 26]);
                
            }else if(c >= 'A' && c <= 'Z'){
                sb.append(hiAp[(c-'A'+n) % 26]);
            }else{
                sb.append(c);
            }            
        }
        answer = sb.toString();
        
        return answer;
    }
}

 

프로그래머스 : 최소직사각형

https://school.programmers.co.kr/learn/courses/30/lessons/86491

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이접근법 : 가로, 세로 중 큰값 , 작은 값을 가려내어 각각의 값에서 max값을 뽑아낸다.

class Solution {
    public int solution(int[][] sizes) {
        int answer = 0;
        int max = 0;
        int min = 0;
        for(int i =0; i< sizes.length; i++){
            if(sizes[i][0] > sizes[i][1]){
                max = Math.max(max,sizes[i][0]);
                min = Math.max(min,sizes[i][1]);
            }else{
                max = Math.max(max,sizes[i][1]);
                min = Math.max(min,sizes[i][0]);
            }            
        }
        System.out.print( max + "  " + min);
        answer = max * min;
        
        return answer;
    }
}

 

프로그래머스 : [1차] 비밀지도

https://school.programmers.co.kr/learn/courses/30/lessons/17681

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 접근법 : arr1, arr2 int 배열로 들어오는 값을 arr1[i], arr2[i] 을 OR 연산을 하여 둘 중 하나만이라도 2진수로 표현하였을 때 1이 있는 경우를 계산한다. String s = Integer.toBinaryString(arr1[i] | arr2[i]); 으로 받은 s을 char로 나누어 1이면 #, 0이면 공백(" ") 넣어주는 방식으로 풀이하였다.

 (이렇게만 풀 경우, 값이 작을 경우 6자리를 다 채우지 못하고 나오는 경우가 있는데, 그럴 경우 s의 길이와 n의 길이를 비교하여 차이만큼 s 앞에 0을 붙여주었다.)

class Solution {
    public String[] solution(int n, int[] arr1, int[] arr2) {
        String[] answer = new String[n];
        for(int i=0; i< arr1.length; i++){
            String s = Integer.toBinaryString(arr1[i] | arr2[i]);
            StringBuilder sb = new StringBuilder();
            if(s.length() != n){
                for(int j=0; j< n-s.length(); j++){
                    sb.append(" ");
                }
            }
                for(char c : s.toCharArray()){
                    if(c == '1'){
                        sb.append("#");
                    }else{
                        sb.append(" ");
                    }
                }
                answer[i] = sb.toString();
            }
        return answer;
    }
}

프로그래머스 : 문자열 내 마음대로 정하기

https://school.programmers.co.kr/learn/courses/30/lessons/12915#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이 접근법: 우선순위 큐 : PriorityQueue<String>을 사용하여 (new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {}를 사용하여 비교 함수를 구현하여 문제에서 나온 순서대로 정렬하고, poll()해서 하나씩 합쳐 출력한다. compare() 함수 구현에 있어, n 번째 char를 비교하고 같은 문자이면 뒷쪽은 사전 순서로 정렬하는데 아래와 같이 구현하면 될 줄 알았는데, 통과하지 못하였다. 

 

            public int compare(String o1, String o2) {
                char[] o1ch = o1.toCharArray();
                char[] o2ch = o2.toCharArray();
                if(o1ch[n] == o2ch[n]){
                    return o1ch[n+1]-o2ch[n+1];
                }
                return o1ch[n]-o2ch[n];
            }

위 코드와 같이 구현하면 다음 char만 확인해 정렬하므로, 문제가 요구하는 순서대로 정렬할 수 없다. 그래서 아래와 같이 compartTo함수를 사용하면 string을 사전순으로 정렬할 수 있다.

 

            public int compare(String o1, String o2) {
                char[] o1ch = o1.toCharArray();
                char[] o2ch = o2.toCharArray();
                if(o1ch[n] == o2ch[n]){
                    return o1.compareTo(o2);
                }
                return o1ch[n]-o2ch[n];
            }

 

전체 코드 : 

import java.util.*;
class Solution {
    public String[] solution(String[] strings, int n) {
        String[] answer = new String[strings.length];
        PriorityQueue<String> pq = new PriorityQueue<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                char[] o1ch = o1.toCharArray();
                char[] o2ch = o2.toCharArray();
                if(o1ch[n] == o2ch[n]){
                    return o1.compareTo(o2);
                }
                return o1ch[n]-o2ch[n];
            }
        });
        
        for(String s : strings){
            pq.offer(s);
        }
        
        for(int i = 0; i<strings.length; i++){    
            answer[i] = pq.poll();
        }
        
        return answer;
    }
}