코딩 기초 트레이닝 Day 6 with Java

2024. 3. 7. 20:26코딩테스트 리뷰(프로그래머스)/코딩 기초 트레이닝 with Java

문제.1 - 마지막 두 원소

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

 

프로그래머스

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

programmers.co.kr

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

제한 사항
  • 2 <= num_list.length <= 10
  • 1 <= num_list 의 원소 <= 9
import java.util.*;
class Solution {
    public int[] solution(int[] num_list) {
        // 마지막 원소가 그전 원소보다 크면 마지막 원소 - 그전 원소 = 리턴
        // 마지막 원소가 그전 원소가 크지 않으면 마지막 원소를 2배
        
        int last = num_list[num_list.length- 1 ];
        int before = num_list[num_list.length - 2];
        
        int inputValue = last > before ? last - before : last * 2;

        int[] answer = Arrays.copyOfRange(num_list, 0, num_list.length+1);

        answer[num_list.length] = inputValue;
        return answer; 
    }
}

 

풀이 해설

풀고 나서 수정을 더해서 올렸습니다.

 

해당 문제에서는 마지막 요소만 비교를 해서 answer 배열에 추가를 하는 형식이였습니다.

해서 num_list의 마지막 원소와 그전 원소만 따로 변수에 넣어두었습니다. ( 마지막원소 : last, 그전 원소 : before )

그다음 inputValue에서 비교해서 넣을 값을 만들어둡니다.

그 다음 answer 에서 Arrays 클래스로 num_list의 서브 배열을 만듭니다.

그 다음 answer 배열의 마지막에 inputValue를 넣어줍니다.

 

* 특이사항

Arrays.copyOfRange 에서 참조하는 배열의 크기를 넘어도 복사가 되더군요..?

복사되는 내용을 보니 마지막 원소가 0으로 되는 것을 디버그 모드로 확인했습니다.

아예 새로운 배열을 만들어서 넘겨주는 메소드인듯합니다.

 

문제 틀린점

문제 설명에서

  • 마지막 원소가 그전 원소보다 크면 마지막 원소에서 그전 원소를 뺀 값을
    • => if ( last > before ) inputValue = last - before
  • 마지막 원소가 그전 원소보다 크지 않다면 마지막 원소를 두배한 값을 추가하여
    • => if ( last < before ) inputValue = last * 2

크면의 반대는 작거나 같다인데 조건문이 잘못되어있는 듯합니다. ( 지적 환영합니다. )

 

문제.2 - 수 조작하기 1

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

 

프로그래머스

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

programmers.co.kr

문제 설명

정수 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 함수를 완성해주세요.

제한 사항
  • -100000 <= n <= 100000
  • 1 <= control.length <= 100000
    • control은 알파벳 소문자 "w", "a", "s", "d"로 이루어진 문자열입니다.
class Solution {
    public int solution(int n, String control) {
        int answer = n;
        for ( String c : control.split("")) {
            switch(c) {
                case "w" : answer++;
                    break;
                case "s" : answer--;
                    break;
                case "d" : answer+=10;
                    break;
                case "a" : answer-=10;
                    break;
            }
        }
        return answer;
    }
}

 

 

문제.3 - 수 조작하기 2

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

 

프로그래머스

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

programmers.co.kr

문제 설명

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

  • "w" : 수에 1을 더한다.
  • "s" : 수에 1을 뺀다.
  • "d" : 수에 10을 더한다.
  • "a" : 수에 10을 뺀다.
그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i 번의 조작을 가한 결과가 저장되어 있습니다.
주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.
 
제한 사항
  •  2 <= numLog.length <= 100000
    • -100000 <= numLog[0] <= 100000
    • 1 <= i <= numLog.length인 모든 i 에 대해서 | numLog[i] - numLog[i - 1]|의 값은 1또는 10입니다.
class Solution {
    public String solution(int[] numLog) {
        String answer = "";
        
        for ( int i = 1; i < numLog.length; i++) {
            int value = numLog[ i ] - numLog[ i-1 ];
            switch(value) {
                case 1 : answer += "w";
                    break;
                case -1 : answer += "s";
                    break;
                case 10 : answer += "d";
                    break;
                case -10 : answer += "a";
                    break;
            }
        }
        
        return answer;
    }
}

 

 

문제.4 - 수열과 구간 쿼리 3

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

 

프로그래머스

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

programmers.co.kr

문제설명


정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [i, j] 꼴입니다.
각 query 마다 순서대로 arr[i]의 값과 arr[j]의 값을 서로 바꿉니다.
위 규칙에 따라 queries를 처리한 이후의 arr를 return 하는 solution 함수를 완성해주세요.

제한사항
  • 1 <= arr.length <= 1000
    • 0 <= arr의 원소 <= 1000000
  • 1 <= queries.length <= 1000
    • 0 <= i < j < arr.length
class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = arr;
        
        for ( int i = 0; i < queries.length; i++ ) {
            int temp = answer[queries[i][0]];
            answer[queries[i][0]] = answer[queries[i][1]];
            answer[queries[i][1]] = temp;
        }
        return answer;
    }
}

 

 

문제.5 - 수열과 구간 쿼리 2

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

 

프로그래머스

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

programmers.co.kr

문제 설명


정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s,e,k] 꼴입니다.
각 query마다 순서대로 s <= i <= e 인 모든 i에 대해서 k보다 크면서 가장 작은 arr[i]를 찾습니다.
각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
단, 특정 쿼리의 답을 존재하지 않으면 -1을 저장합니다.

제한사항
  • 1 <= arr.length <= 1000
    • 0 <= arr의 원소 <= 1000000
  • 1 <= queries.length <= 1000
    • 0 <= s <= e < arr.length
    • 0 <= k <= 1000000
import java.util.*;
class Solution {
    public int[] solution(int[] arr, int[][] queries) {
        int[] answer = new int[queries.length];
        for ( int count = 0; count < queries.length; count++) {

            int[] subArr = Arrays.copyOfRange(arr, queries[count][0], queries[count][1]+1);
            int min = Integer.MAX_VALUE;
            for ( int i = 0; i < subArr.length; i++) {
                if( subArr[i] < min && subArr[i] > queries[count][2]) min = subArr[i];
            }

            answer[count] = min == Integer.MAX_VALUE ? -1 :  min;
        }
        return answer;
    }
}

 

 

느낀점

몇일간 바뻐서 못했는데, 한 2~3일만에 잡아서 그런지 하나하나 푸는데 좀 오래좀 걸리네요.

다시 꾸준히 해보겠습니다.

다들 코딩 화이팅