새소식

카테고리 없음

[Java][프로그래머스] 87390, n^2 배열 자르기

  • -
728x90
 

프로그래머스

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

programmers.co.kr

 

🟢 87390, n^2 배열 자르기

간만에 프로그래머스 풀이를 작성한다. 코딩테스트를 앞두고 있는데 LEVEL 3 도 다시 풀어보려고 하니 너무 놓고 있었는지 하나도 못 푸는 상황.. 계정을 새로 파서 LEVEL2 부터 전부 풀이한다.

[문제 설명]

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.

  1. n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
  2. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
  3. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.
  4. 새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.

정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.

 

이번 문제는 점화식 ? 을 생각하면 풀 수 있을 것이라고 생각해서 n 이 2,3,4 의 케이스를 모두 그려봤다.

[n = 3]
123
223
333

00 01 02
10 11 12
20 21 22

[n = 4]
1234
2234
3334
4444

00 01 02 03
10 11 12 13
20 21 22 23
30 31 32 33

 

우선 n 이 3일 때 위와 같은 숫자 블록을 가질 수 있다. 이를 행열을 통해 나타내 보자고 생각했다. 쉽게 말해 x,y 좌표를 생각하면 된다.

가장 우측 제일 상단의 3의 값을 보면 이는 x 는 2 이고, y 는 0 이다.

이는 2번째 값이며 3이고 x:2, y:0 이라고 생각할 수 있다. 유심히 보면 규칙을 찾을 수 있다. i번째의 값을 기준으로  x 좌표 는 i 를 n 으로 나눈 나머지 값이고, y 좌표는 몫이다. 또한 해당 좌표의 값은 Math.max(i/n, i%n) + 1 이라는 규칙을 찾아낼 수 있다. 규칙을 찾았다면 이를 로직으로 구현하는 것은 어렵지 않다. 주의할 것은 Long 값을 int 로 변환하는 정도. 필자는 stream 을 사용해서 풀이했다. 

 

import java.util.*;
import java.util.stream.*;

public class Solution {
    public static void main(String[] args) {
        int n = 3; 
        long left = 2;
        long right = 5;
        int[] answer = solution(n,left,right);
        System.out.println(answer);
    }

    public static int[] solution(int n, long left, long right) {
        List<Long> list = new ArrayList<>();

        for(long i=left; i <=right; i++) {
            list.add(Math.max(i/n,i%n) + 1);
        }

		// Long을 int로 변환
        return list.stream()
                    .mapToInt(Long::intValue)
                    .toArray();
    }
}
728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.