[프로그래머스] JAVA

설하나·2023년 10월 14일
0

알고리즘

목록 보기
22/22

1. 마지막 두 원소

[문제 상황]

정수 리스트 num_list가 주어질 때, 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두 배한 값을 추가하여 return하도록 solution 함수를 완성해주세요.

[풀이 코드]

import java.util.ArrayList;

class Solution {
    public int[] solution(int[] num_list) {
        ArrayList<Integer> answerList = new ArrayList<>();

        for (int i = 0; i < num_list.length; i++) {
            answerList.add(num_list[i]);
            
            if(i == num_list.length-1){
                if(num_list[i]>num_list[i-1]){
                    answerList.add(num_list[i]-num_list[i-1]);    
                }else{
                    answerList.add(num_list[i]*2);
                }   
            }
        }

        int[] answer = new int[answerList.size()];
        for (int i = 0; i < answerList.size(); i++) {
            answer[i] = answerList.get(i);
        }

        return answer;
    }
}

[문제 해결 방향]

먼저 ArrayList를 import해서 동적배열을 생성하였다. 기존의 코드는 int[] answer = {}; 가 주어졌었는데 이는 동적으로 길이를 조절할 수 없어서 ArrayList를 사용하였다.
이후 for문은 num_list의 길이만큼 돌면서 for문 안에서 마지막 원소인가를 if문으로 확인하였다.
확인을마치고 이제 마지막 원소와 전 원소의 크기를 비교하였고, 문제에 주어진 연산을 수행한 후 answerList라는 ArrayList에 추가하였다. 그 후 int[]형으로 return 해주기위해서 answerList를 돌면서 answer에 하나씩 get해주었다.
처음에 풀었던 코드는 아래와 같다.

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

동적으로 만드는 방법이 없을까라는 고민끝에 저런 코드가 나오게 되었다.

2. 수 조작하기 1

[문제 상황]

정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.

  • "w" : n이 1 커집니다.
  • "s" : n이 1 작아집니다.
  • "d" : n이 10 커집니다.
  • "a" : n이 10 작아집니다.

위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.

[풀이 코드]

class Solution {
    public int solution(int n, String control) {
        int answer = n;
        for(int i=0; i<control.length(); i++){
            char ctrl = control.charAt(i);
            if(ctrl == 'w'){
                answer++;
            }else if(ctrl == 's'){
                answer--;
            }else if(ctrl == 'd'){
                answer+=10;
            }else{
                answer-=10;
            }
        }
        return answer;
    }
}

[문제 해결 방향]

이번 풀이는 String으로 입력받은 control을 split으로 배열로 만들지 않고 풀이를 해봤다.
for문에서 control의 길이만큼 반복하면서 현재 index값에 따른 문자를 ctrl에 저장을 하였고, if~else문을 사용해서 각 경우의 연산을 수행한 값을 answer에 계속 누적하였다.
지금생각해보면 switch case문을 사용했으면 더 명확하고 깔끔하게 코드를 작성할 수 있었을꺼같다.

3. 수 조작하기 2

[문제 상황]

정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다.

  • "w" : 수에 1을 더한다.
  • "s" : 수에 1을 뺀다.
  • "d" : 수에 10을 더한다.
  • "a" : 수에 10을 뺀다.

그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다.

주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.

[풀이 코드]

class Solution {
    public String solution(int[] numLog) {
        String answer = "";
        for(int i=0; i<numLog.length - 1; i++){
            int result = numLog[i+1] - numLog[i];
            switch(result) {
                case 1: answer+="w"; break;
                case -1: answer+="s"; break;    
                case 10: answer+="d"; break;
                case -10: answer+="a"; break;
                default: break;
            }
        }
        return answer;
    }
}

[문제 해결 방향]

numLog를 for문을 통해 길이만큼 돌면서 현재 index의 값과 1칸 앞의 index에 해당하는 값의 차이가 결국 어떤 연산을 시행했는지에 대한 정보를 담고있다. 따라서, 그 결과를 result라는 변수에 저장하고 switch~case문을 통해서 answer에 더한후 이를 return 하였다.

4. 수열과 구간 쿼리3

[문제 상황]

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다.

각 query마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.

위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해 주세요.

[풀이 코드]

class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = arr;
        for(int i=0; i<queries.length; i++){
            int[] query = queries[i];
            int temp = answer[query[0]];
            
            answer[query[0]] = answer[query[1]];
            answer[query[1]] = temp;
        }
        return answer;
    }
}

[문제 해결 방향]

변환할 배열을 answer에 복사해두고, queries의 길이만큼 for문을 돌면서, query 변수에 어떤 index의 값을 바꿀지 저장하였다.
그 후, 첫번째 index값을 temp라는 변수에 임시저장해두고 두번째 변수를 첫번째 변수의 index에 할당, temp에 임시로 저장해둔 값을 두번째 변수에 할당하여 서로 바꾼후 answer를 return 하였다.

5. 수열과 구간 쿼리2

[문제 상황]

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.

각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.

각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.

[풀이 코드]

import java.util.ArrayList;
import java.util.Arrays;

public class Solution {
    public static int[] solution(int[] arr, int[][] queries) {
        int[] answer = new int[queries.length];
        Arrays.fill(answer, -1); // 초기값으로 -1을 채워놓습니다.

        for (int i = 0; i < queries.length; i++) {
            int s = queries[i][0];
            int e = queries[i][1];
            int k = queries[i][2];

            int minValue = Integer.MAX_VALUE; 

            for (int j = s; j <= e; j++) {
                if (arr[j] > k && arr[j] < minValue) {
                    minValue = arr[j];
                }
            }

            if (minValue != Integer.MAX_VALUE) {
                answer[i] = minValue;
            }
        }

        return answer;
    }

}

[문제 해결 방향]

queries의 길이만큼 for문을 돌면서, 각 값을 변수 s, e, k에 저장하고 최솟값을 저장할 변수 minValue에 일단 최대값을 저장하였다. 그 후 for문을 s부터 e까지 돌면서 k보다 크면서 가장작은 값을 탐색하였다. 이는 minValue에 저장하였고 그후 if문을 돌면서 만약 최대값이 minValue가 아니라면 answer에 값을 저장하였고 그가 아니라면 -1을 유지하도록 작성하였다.

오.알.완!!!!

profile
Backend

0개의 댓글