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

[JAVA] 프로그래머스 알고리즘 문제풀이 - Level 0 (127~133번 문제풀이)

남건욱 2023. 10. 12. 14:59
반응형
127. 문자열 묶기

문제

import java.util.*;

class Solution {
    public int solution(String[] strArr) {
        int answer = 0;
        
        Map<Integer, Integer> result = new HashMap<>();
        
        for(int i=0; i<strArr.length; i++){
            int length = strArr[i].length();
            if(result.containsKey(length)){
                result.put(length, result.get(length)+1);
            } else {
                result.put(length, 1);
            }
        }
        
        answer = Collections.max(result.values());
        
        
        
        return answer;
    }
}

<작성한 코드>

Map형태의 배열을 하나 만들어줬다. 그 뒤 for문으로 strArr길이만큼 반복해 줬고 각 요소의 길이를 key값으로 지정했다. 만약 result안에 key값으로 길이가 이미 들어어 있다면 그 값에 +1을 해줬고 들어있지 않다면 그 길이의 키에 값을 1로 지정해 줬다. 그 뒤 answer에 Collections.max를 사용해서 hashmap의 값 중 가잔 큰 것을 가져와 반환했다.

 

 

 

 

128. 배열 비교하기

문제

class Solution {
    public int solution(int[] arr1, int[] arr2) {
        int answer = 0;
        int sum1 = 0;
        int sum2 = 0;
        
        if(arr1.length < arr2.length) return -1;
        else if(arr1.length > arr2.length) return 1;
        
        for(int a : arr1){
            sum1 += a;
        }
        
        for(int a : arr2){
            sum2 += a;
        }
        
        if(sum1 == sum2) return 0;
        answer = (sum1 > sum2) ? 1 : -1;
        
        return answer;
    }
}

<작성한 코드>

if, else를 사용해서 우선적으로 길이를 비교하여 -1 / 1을 반환하도록 했다. 만약 길이가 같다면 for문으로 arr1의 원소의합, arr2의원소의 합을 구해줬다. 구한 합을 비교해서 같으면 0을 리턴하고 아니라면 삼항연산자로 sum > sum2가 참이면 1, 거짓이면 -1을 반환하도록 했다.

 

 

 

129. 배열의 길이를 2의 거듭제곱으로 만들기

문제

class Solution {
    public int[] solution(int[] arr) {
        int size = 1;
        
        int length = arr.length;
        if((length & length-1) == 0) return arr;
        
        while(length > size){
            size *= 2;
        }
        
        int[] answer = new int[size];
        for(int i=0; i<length; i++){
            answer[i] = arr[i];
        }
        
        
        return answer;
    }
}

<작성한 코드>

length & length-1 을해서 AND연산으로 0이 나오면 2의 거듭제곱이므로 arr를 그대로 반환하였다. 만약 아니라면 while문으로 1부터 2배씩 늘려가서 length길이보다 커질 때까지 반복한다. while문이 종료되고 size가 초기화되면 그 길이만큼 answer의 배열길이를 선언해 주고 answer [i] 안에 arr [i]를 넣어줬다. int형 배열은 초기화해주지 않은 값은 0으로 설정되기 때문에 그대로 반환해 줬다.

 

 

 

130. 무작위로 K개의 수 뽑기

문제

import java.util.*;

class Solution {
    public int[] solution(int[] arr, int k) {
        int[] answer = new int[k];
        List<Integer> result = new ArrayList<>();
        
        for(int a : arr){
            if(result.contains(a)){
                continue;
            }
            result.add(a);
        }
        
        while(result.size() < k){
            result.add(-1);
        }
        
        for(int i=0; i<k; i++){
            answer[i] = result.get(i);
        }
        
        
        return answer;
    }
}

<작성한 코드>

List형 배열 result를 선언해 줬다. 그 뒤 forEach문으로 arr안에 있는 모든 원소만큼 넣어줬고 if로 result안에 현재 원소 a값과 일치하는 게 있는지 찾는다. 있다면 continue를 만나서 그다음 원소가 대입될것이고 없다면 result에 a값이 추가된다. 그 다음 while문에서는 result의 길이가 k보다 작다면 작지 않을 때까지 result에 -1을 대입해 준다. 그리고 이 result의 값을 그대로 answer배열에 넣어주고 반환하였다.

 

 

 

 

131. 배열 만들기 6

문제

import java.util.*;

class Solution {
    public int[] solution(int[] arr) {
        List<Integer> stk = new ArrayList<>();
        int i=0;
        
        while(i < arr.length){
            if(stk.isEmpty()){
                stk.add(arr[i]);
                i++;
            } else if(stk.get(stk.size()-1)  == arr[i]){
                stk.remove(stk.size()-1);
                i++;
            } else{
                stk.add(arr[i]);
                i++;
            }
        }
        int[] answer;
        
        if(stk.size() == 0){
            answer = new int[1];
            answer[0] = -1;
            return answer;
        } 
        
        answer = new int[stk.size()];
        for(int j=0; j<stk.size(); j++){
            answer[j] = stk.get(j);
        }
                       
        return answer;
    }
}

<작성한 코드>

List형 배열인 변수 stk를 선언했다. 문제에서 요구하는 대로 i의 초기값은 0으로 잡아줬고, i가 arr의 길이보다 작을 때 반복시켰다. isEmpty()를 사용해서 리스트가 비어있으면 arr [i]를 추가해주고 i를 1 더해줬다. 다음 if문은 stk의 마지막 원소가 arr[i]와 같을때 마지막 원소를 지우고 i를 더해줬다. else문에서는 stk에 arr[i]를 더해주고 i도 1을 더해줬다.

그 뒤 answer 배열을 선언해 주고 stk의 사이즈가 0이면 길이를 1로 초기화하고 -1을 담은 뒤 반환시켰다. 사이즈가 0이 아니라면 stk 원소의 값을 그대로 answer에 대입해 주고 반환하였다.

 

 

 

 

132. 빈 배열에 추가, 삭제하기

문제

import java.util.*;

class Solution {
    public int[] solution(int[] arr, boolean[] flag) {
        List<Integer> result = new ArrayList<>();
        
        for(int i=0; i<flag.length; i++){
            if(flag[i]){
                for(int j=0; j<arr[i]*2; j++){
                    result.add(arr[i]);
                }
            }else{
                for(int j=0; j<arr[i]; j++){
                result.remove(result.size()-1);
                }
            }
        }
        
        int[] answer = new int[result.size()];
        
        for(int i=0; i<result.size(); i++){
            answer[i] = result.get(i);
        }
        
        return answer;
    }
}

<작성한 코드>

List형 배열 result를 선언했다. 그리고 문제에 나온 대로 flag가 참이면 arr [i]의 값만큼 result에 추가해 줬고, 거짓이라면 그 값의 횟수만큼 resutl에서 삭제시켜 줬다. 그 뒤 anwer에 길이를 선언해 주고 result의 값을 그대로 answer에 대입해 주고 반환하였다.

 

 

 

133. 배열의 원소만큼 추가하기

문제

import java.util.*;

class Solution {
    public int[] solution(int[] arr) {
        List<Integer> result = new ArrayList<>();
        
        for(int i=0; i<arr.length; i++){
            for(int j=0; j<arr[i]; j++){
                result.add(arr[i]);
            }
        }
        
        int[] answer = new int[result.size()];
        
        for(int i=0; i<result.size(); i++){
            answer[i] = result.get(i);
        }
        
        
        return answer;
    }
}

<작성한 코드>

List 형식의 배열 result를 선언하고 arr의 길이만큼 for문을 돌렸다. 내부에서는 중첩 for문으로 j는 0부터 arr [i]의 숫자까지 반복하도록 하였고 result에 arr [i] 값을 그 숫자만큼 더해줬다. 그 뒤 answer에 result값을 대입하고 반환했다.

반응형
프로필사진

남건욱's 공부기록