n^2 배열 자르기 (자바)

김재현·2023년 12월 21일
0

알고리즘 풀이

목록 보기
62/89

문제

오답 코드 (시간초과)

        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)에서 값을 생성하는 무한 스트림을 생성

profile
I live in Seoul, Korea, Handsome

0개의 댓글