List<Integer> integerList = new ArrayList<>();
long index=0;
for (int i=0;i<n;i++) {
for (int j=0;j<n;j++) {
integerList.add(Math.max(i+1,j+1));
index++;
}
}
return integerList.stream().mapToInt(Integer::intValue).toArray();
행렬에 대입되는 값은 행과 열의 값중 큰 값이 대입된다.
처음엔 어 쉽네? 했다가 숫자가 매우 크다는 것을 깨달았다.
class Solution {
public 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;i++) {
int a = (int)(i/n)+1;
int b = (int)(i%n)+1;
answer[index]=Math.max(a,b);
index++;
}
return answer;
}
}
그렇다면 left와 right 사이에 해당하는 숫자로만 값을 구해야겠다고 생각했다. 행렬을 자세히 보니 x번째 숫자를 n으로 나눈 몫과 나머지로 행렬의 값을 구할 수 있겠어서 이렇게 바꿔서 풀이했다.
import java.util.Arrays;
import java.util.stream.LongStream;
class Solution {
public int[] solution(int n, long left, long right) {
return LongStream.rangeClosed(left, right).mapToInt(value -> (int) (Math.max(value / n, value % n) + 1)).toArray();
}
}
아닠ㅋㅋㅋ 이게 한줄이 되네!! 나도 stream으로 해보려다가 int가 아니라 stream을 못쓰긴 했는데!
LongStream : Java 8 이상에서 제공되는 스트림(Stream) 중 하나로, long 값들의 스트림을 생성하고 다양한 연산을 수행할 수 있게 해준다.
rangeClosed : 시작값과 종료값 사이의 값을 생성하는데, 시작값부터 종료값까지의 값을 포함.
range: 시작값은 포함하고 종료값은 포함하지 않음.
iterate(long seed, LongUnaryOperator f): 주어진 초깃값(seed)에서 시작하여 주어진 연산자(f)를 반복적으로 적용하여 값을 생성하는 무한 스트림을 생성
generate(LongSupplier s): 주어진 공급자(supplier)에서 값을 생성하는 무한 스트림을 생성