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