💡 코테/99클럽

[ 99클럽 코테 스터디 13일차 TIL ] 특정범위 배열복사 및 프로그래머스(K번째수와 덧칠하기 문제)

MNY 2024. 4. 10. 17:02
728x90
반응형
💡 오늘의 학습 키워드

- 특정범위 배열복사 : Arrays.copyOfRange(array, int index1, int index2)
- 프로그래머스
    * K번째수 : 비기너 문제
    * 덧칠하기 : 미들러 문제

 

특정범위 배열복사 Arrays.copyOfRange()

: 특정 배열의 원하는 범위만큼 복사하여 새로운 배열을 만드는 메소드 함수

* Arrays.copyOfRange() 함수를 사용하기 위해서는 import java.util.Arrays;를 해줘야 한다.

import java.util.Arrays;

int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8};
int[] temp = Arrays.copyOfRange(arr, 2, 5);

System.out.println(Arrays.toString(arr));

// result : [2, 3, 4, 5]

 

 


 

오늘의 회고

문제1  : [K번째수]

  • 어떤 문제가 있었고, 나는 어떤 시도를 했는지

임의의 숫자가 입력된 1차원 배열과 [i, j, k]의 요소가 입력되어 있는 2차원 배열을 매개변수로 받는다.

1차원 배열에서 i번째부터 j번째까지의 숫자를 정렬하여 k번째의 숫자들을 하나의 배열로 만들어 리턴해주는게 문제였다.

 

2차원 배열을 돌면서 (i-1)~(j-1)인덱스의 배열을 복사한다.

그 후 복사된 배열을 정렬해서 (k-1)인덱스의 값을 리턴해야할 배열에 넣는다.

이런 식으로 문제를 풀었고, 문제가 단순해서 한 번에 금방 풀이할 수 있었다.

 

 

프로그래머스

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

programmers.co.kr

 

  • 어떻게 해결했는지
// input : 임의의 숫자 배열(int array)
        // [i, j, k]를 원소로 가지는 2차원 배열(int[][] commands)
// variable : 리턴해야할 배열의 크기(int size)
            // 리턴해야할 배열(int[] answer)

/* process

commands의 크기 구하기
answer의 크기 할당 및 선언
commands의 크기만큼 반복문(row = 0)
    i, j, k값 넣어주기
    (i-1) ~ (j-1)까지의 배열 복사
    복사된 배열 정렬 후 (k-1)의 요소 answer[row]에 넣기
*/

// return : array에서 i부터 j까지 자르고 정렬한 후 k번째 숫자들의 배열

import java.util.Arrays;

class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int size = commands.length;
        int[] answer = new int[size];
        
        for (int row = 0; row < size; row++) {
            int i = commands[row][0];
            int j = commands[row][1];
            int k = commands[row][2];
            
            int[] temp = Arrays.copyOfRange(array, i-1, j);
            Arrays.sort(temp);
            answer[row] = temp[k-1];
        }
        
        return answer;
    }
}

 

문제2  : [덧칠하기]

  • 어떤 문제가 있었고, 나는 어떤 시도를 했는지

페인트를 칠해야 할 구역을 n, 벽에 페인트를 칠하는 롤러의 길이는 m, 다시 칠하기로 정한 구역들의 번호는 section의 배열로 입력받는다. 페인트를 얼마만큼의 횟수로 칠해야 모든 구역을 다 칠할 수 있는지 구하는 문제이다.

추가적으로 칠했던 곳을 다시 칠하거나 새롭게 칠하지 않아도 되는 곳을 칠해도 문제없다!

 

처음엔 어떻게 하지? 라며 막막해 했지만

생각해보니 어쨌거나 새로 칠해야할 첫 번째 구역에서 롤러의 길이를 더하는데

다음으로 새로 칠해야 할 구역이 그 안에 있으면 더 뒤의 새로 칠해야할 구역부터 다시 칠하면 되는데

이걸 뭔가 복잡하게 생각했다.

 

결국 문제를 생각하는 과정에서 시간을 좀 잡아먹었다.

 

 

프로그래머스

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

programmers.co.kr

 

  • 어떻게 해결했는지
// input : 페인트 칠해야 할 구역(int: 1~n)
        // 벽에 페인트를 칠하는 롤러의 길이(int: 1~m)
        // 다시 칠하기로 정한 구역들의 번호(int[]: section)
// variable : 배열의 크기(int: size) 
        // 롤러로 칠한 가장 왼쪽 구역 번호(int: left_num) 
        // 칠한 횟수(int: answer)

/* process
배열 크기 구하기
left_num = section[0] // 가장 왼쪽 구역기준 롤러 한 번 칠하기
answer = 1 // 이미 롤러를 한 번 칠한다는 가정이기 때문

배열 크기 만큼 반복문(i = 1)
     배열 요소가 left_num+(m-1)보다 크다면
        left_num = section[i];
        answer++;
*/

// return : 롤러로 페인트 칠해야 하는 최소 횟수(int: answer)

class Solution {
    public int solution(int n, int m, int[] section) {
        int size = section.length;
        int left_num = section[0];
        int answer = 1;
        
        for (int i = 1; i < size; i++) {
            if (section[i] > left_num+(m-1)) {
                left_num = section[i];
                answer++;
            }
        }
        
        return answer;
    }
}

 

  • 무엇을 새롭게 알았는지

비기너 문제를 풀며 copyOfRange라는 함수를 새롭게 배우게 되었다.

그리고 어제자 미들러 문제를 풀이하며 앞으로 미들러 문제를 더 열심히 풀어야겠다고 생각했다. 

미들러 문제를 풀이하지 못하더라도 다른 사람의 풀이를 보며 공부해야겠다.

 

내일 학습할 것은 무엇인지

  • 백준 기본 문제 1개 풀이
  • 자바 형변환 정리
  • CS 공부
  • 클럽99 코딩테스트(비기너 + 미들러)
728x90
반응형