📝 문제
정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
n행 n열 크기의 비어있는 2차원 배열을 만듭니다.i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.
정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요
1️⃣ 첫번째 시도
import java.util.ArrayList;
class Solution {
public static int[] solution(int n, long left, long right) {
ArrayList<Integer> flatArray = new ArrayList<>();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
flatArray.add(Math.max(i, j));
}
}
return flatArray.subList((int) left, (int) right + 1)
.stream()
.mapToInt(i -> i)
.toArray();
}
}
첫번째 시도는 메모리 초과로 실패하였다.
배열 전체를 구하지 않고 처음부터 left..right 범위만 구하면 이중 for 문을 돌리지 않아도 될 것 같다는 생각이 들었다.
2️⃣ 두번째 시도
class Solution {
public static int[] solution(int n, long left, long right) {
int[] answer = new int[(int) (right - left + 1)];
int index = 0;
for (int i = (int) left; i < right + 1; i++) {
int row = i / n;
int column = i % n;
answer[index++] = Math.max(row, column) + 1;
}
return answer;
}
}
두번째 시도는 런타임 에러로 인해 실패하였다.
자세히 보니 for 문에서 left 를 int로 캐스팅하고 있어서 int 의 max 값 이상이 들어오면 에러가 날 수 밖에 없는 결함을 발견하였다.
🔥 풀이 성공
class Solution {
public static int[] solution(int n, long left, long right) {
int[] answer = new int[(int) (right - left + 1)];
int index = 0;
for (long i = left; i < right + 1; i++) {
int row = (int) (i / n);
int column = (int) (i % n);
answer[index++] = Math.max(row, column) + 1;
}
return answer;
}
}
위 코드와 같이 수정하여 풀이 성공
'스터디 > 99클럽 코테 스터디 TIL' 카테고리의 다른 글
99클럽 코테 스터디 6일차 TIL 의상 (0) | 2024.07.28 |
---|---|
99클럽 코테 스터디 5일차 TIL 전화번호 목록 (0) | 2024.07.26 |
99클럽 코테 스터디 4일차 TIL JadenCase 문자열 만들기 (0) | 2024.07.25 |
99클럽 코테 스터디 3일차 TIL 문자열 내 마음대로 정렬하기 (1) | 2024.07.25 |
99클럽 코테 스터디 2일차 TIL x만큼 간격이 있는 n개의 숫자 (2) | 2024.07.23 |