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

[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 1 (53~56번 문제풀이) / Level 0 (224/224)

남건욱 2023. 11. 7. 18:40

목차

    반응형
    53. 최소 직사각형

    문제

    class Solution {
        public int solution(int[][] sizes) {
            int answer = 0;
            int maxW = 0;
            int maxH = 0;
            
            for(int i=0; i<sizes.length; i++){
                int width = Math.max(sizes[i][0], sizes[i][1]);
                int height = Math.min(sizes[i][0], sizes[i][1]);
                
                if(width > maxW){
                    maxW = width;
                }
                
                if(height > maxH){
                    maxH = height;
                }
            }
            
            answer = maxW * maxH;
                
            return answer;
        }
    }

    <작성한 코드>

    최종적으로 들어갈 가로, 세로의 변수를 maxW, maxH로 잡았다. 그 뒤 for문을 사용해서 sizes의 길이만큼 반복시켜 준 뒤 width에는 각 배열의 원소중 큰 값, height에는 각 배열의 원소중 작은 값을 넣어줬다. 그 뒤 if문을 사용해서 크기를 비교해 줬다. width이 maxW보다 크다면 maxW에 값을 대입해 주고 height와 maxH를 비교했을 때 height의 값이 더 크면 maxH에 height을 넣어준다. 이렇게 반복문을 사용하면 둘 중 큰 값은 width에, 작은 값은 height에 비교되면서 각 배열의 두 원소중 작은 값의 가장 큰 값이 maxH에 들어가게 된다. 그 후 answer에 가로, 세로의 길이를 곱해주고 answer을 반환했다.

     

     

     

    54. 나머지가 1이 되는 수 찾기

    문제

    class Solution {
        public int solution(int n) {
            int answer = 1;
            
            while(true){
                if(n%answer == 1){
                    break;
                }
                answer++;
            }
            
            return answer;
        }
    }

    <작성한 코드>

    간단한 문제다. while문을 실행하게 하고 n에서 answer을 나눠서 1이 되면 break를 해줬다. answer은 1씩 더해준다. 그 뒤 answer값을 반환해 줬다.

     

     

     

    55. 신고 결과받기

    문제

    import java.util.*;
    
    class Solution {
        public int[] solution(String[] id_list, String[] report, int k) {
            int[] answer = new int[id_list.length];
            Map<String, HashSet<String>> map = new HashMap<>();
            Map<String, Integer> map2 = new HashMap<>();
            
            
            for(int i=0; i<id_list.length; i++){
                String id = id_list[i];
                map.put(id, new HashSet<>());
                map2.put(id, i);
            }
            
            for(String str : report){
                String[] array = str.split(" ");
                String reporter = array[0];
                String reportee = array[1];
                
                map.get(reportee).add(reporter);
            }
            
            for(int i=0; i<id_list.length; i++){
                Set<String> mail = map.get(id_list[i]);
                
                if(mail.size() >= k){
                    for(String id : mail){
                        answer[map2.get(id)]++;
                    }
                }
            }
        
            return answer;
        }
    }

    <작성한 코드>

    생각할게 많은 문제였다. 우선 map을 두 개 만들었다. map, map2가 있는데 map은 사용자 ID를 키로 가지고 해당 사용자가 신고한 유저들을 담도록 했고, map2는 사용자의 ID를 키로가 지고 해당 사용자의 인덱스를 값으로 가지도록 했다. 첫 번째 for문에서는 ID리스트의 길이만큼 반복하였고 문자열 변수 id에 문자열을 넣어준 뒤 map에는 id와 빈 HashSet을 넣어주고, map2에는 id와 인덱스번호를 넣어줬다. 그 뒤 forEach문에서는 report에 있는 문자열을 공백을 기준으로 나눴다. 나누면 두 개로 나눠지는데 첫 번째가 신고한 유저, 두 번째가 신고당한 유저 이렇게 저장될 것이다. 따라서 map에서 신고당한 유저의 값에 신고한 유저를 추가해 줬다. 이렇게 하면 map에서 key값으로 사용된 사용자가 자신을 신고한 사용자의 이름을 가지게 될 것이다. 그리고 마지막 for문에서는 ID리스트의 길이만큼 반복하게 하였고, map에서 각각의 값을 꺼내서 Set에 넣어줬다. 만약 크기가 k보다 크거나 같으면 forEach문을 사용해서 그에 맞는 인덱스값인 map2를 사용해 1씩 더해줬다. 그 뒤 answer을 반환하였다.

     

     

     

    56. 성격 유형 검사하기

    문제

    import java.util.*;
    
    class Solution {
        public String solution(String[] survey, int[] choices) {
            String answer = "";
            Map<String, Integer> map = new HashMap<>();
            
            for(int i=0; i<survey.length; i++){
                int num = choices[i];
                String[] s = survey[i].split("");
                
                if(num > 0 && num < 4){
                    map.put(s[0], map.getOrDefault(s[0], 0) + 4 - num);
                } else if(num > 4){
                    map.put(s[1], map.getOrDefault(s[1], 0) + num - 4);
                }
            }
            
            // RT
            if(map.getOrDefault("R", 0) >= map.getOrDefault("T", 0)){
                answer += "R";
            } else{
                answer += "T";
            }
            
            //CF
            if(map.getOrDefault("C", 0) >= map.getOrDefault("F", 0)){
                answer += "C";
            } else{
                answer += "F";
            }
            
            // JM
            if(map.getOrDefault("J", 0) >= map.getOrDefault("M", 0)){
                answer += "J";
            } else{
                answer += "M";
            }
            
            // AN
            if(map.getOrDefault("A", 0) >= map.getOrDefault("N", 0)){
                answer += "A";
            } else{
                answer += "N";
            }
            
            return answer;
        }
    }

    <작성한 코드>

    map 하나를 선언해 주고 시작했다. for문을 사용해서 survey의 크기만큼 반복해 주고 s를 공백 없이 잘라서 문자열 배열 s에 넣어줬다. 그렇게 되면 두 개로 나뉠 것이다. 그 뒤 num의 크기를 비교했다. 1~3이라면 s [0]의 점수에 더해줘야 한다. 따라서 4에서 점수만큼 빼준뒤 넣어줬다. 만약 4보다 크다면 s [1]의 점수에 더해줘야 하기 때문에 num에서 4를 빼서 넣어줬다. 이렇게 되면 모르겠음을 제외하고 점수가 들어간다. 그 뒤 RT, CF, JM, AN을 각각 비교해 줬다. map에서 값을 꺼내왔다. 만약 값이 없다면 0을 기본값으로 잡아줬다. 그 뒤 큰 값을 answer에 더해주고 answer을 반환하였다.

    반응형
    프로필사진

    남건욱's 공부기록