일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Flutter
- 개발자스터디
- 개발자블로그
- 국비
- 소프트웨어
- wil
- 스파르타내일배움캠프TIL
- java
- 컴퓨터개론
- 스파르타내일배움캠프WIL
- 코딩테스트
- 99클럽
- 99일지
- 운영체제
- 개인공부
- 자바
- til
- Spring
- MySQL
- 항해
- 백준
- 컴퓨터구조론 5판
- 프로그래머스
- 부트캠프
- 내일배움캠프
- 스파르타내일배움캠프
- Python
- 중심사회
- AWS
- 스파르타코딩클럽
- Today
- Total
컴공생의 발자취
특정범위 배열복사 및 프로그래머스(K번째수와 덧칠하기 문제) 본문
💡 오늘의 학습 키워드
- 특정범위 배열복사 : 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)인덱스의 값을 리턴해야할 배열에 넣는다.
이런 식으로 문제를 풀었고, 문제가 단순해서 한 번에 금방 풀이할 수 있었다.
- 어떻게 해결했는지
// 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의 배열로 입력받는다. 페인트를 얼마만큼의 횟수로 칠해야 모든 구역을 다 칠할 수 있는지 구하는 문제이다.
추가적으로 칠했던 곳을 다시 칠하거나 새롭게 칠하지 않아도 되는 곳을 칠해도 문제없다!
처음엔 어떻게 하지? 라며 막막해 했지만
생각해보니 어쨌거나 새로 칠해야할 첫 번째 구역에서 롤러의 길이를 더하는데
다음으로 새로 칠해야 할 구역이 그 안에 있으면 더 뒤의 새로 칠해야할 구역부터 다시 칠하면 되는데
이걸 뭔가 복잡하게 생각했다.
결국 문제를 생각하는 과정에서 시간을 좀 잡아먹었다.
- 어떻게 해결했는지
// 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 코딩테스트(비기너 + 미들러)
'💡 코테' 카테고리의 다른 글
프로그래머스(2016년) (0) | 2024.04.12 |
---|---|
프로그래머스(가운데 글자 가져오기 및 콜라 문제) (0) | 2024.04.11 |
없는 숫자 더하기 (0) | 2024.04.09 |
평균 구하기 (1) | 2024.04.07 |
짝수와 홀수 (0) | 2024.04.06 |