TIL

[코테연습] n^2 배열자르기

크라00 2024. 8. 20. 17:00

- 배열 / 반복문 문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/87390

 

프로그래머스

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

programmers.co.kr

 

- 문제분석

1. 임의의 n 숫자가 있고, n 숫자만큼 정사각형의 2중배열이 있다.

2. 해당 이중 배열의 원소는 i = 1 부터 1씩 증가하여 행 / 열 중 큰 값을 따른다.

2-1. n = 2 가 있다면,

  1 2

  2 2 

의 배열의 형태가 존재한다.

2-2. n = 3 이라면,

  1 2 3

  2 2 3

  3 3 3

 

이다. 즉 행 / 열 중 큰 값을 원소로한다.

 

3. 이후, 2차원 배열을 1차원 배열로 쭉 이어 붙이듯이 나열한다.

4. 그리고 int left,  int right 숫자가 주어질때, arr[left] ~ arr[right] 까지의 원소의 숫자를 1차원 배열에 담아 출력해라.

 

- 문제풀이

1. 문제는 단순히 2중 배열을 출력할 수 있도록 2중 for 문을 사용하여, left ~ right 까지의 원소를 담아내면 된다.

2. 그러나 2중 배열로 출력할 시에 time limit 가 걸리므로, 1중 for 문을 사용하여 출력할 수 있도록한다.

3. int i = left; i <= right; i++ 로 반복문을 출력하고,

3-1. int row = i/n; int col = i%n; 으로 변경하면 각 row와 col 의 값을 구할 수 있다.

3-2. n = 3 이라면, i 가 0부터 증가하므로, int 값으로 변경했을 때, 0/3 = 0, 1/3 = 0, 2/3 = 0 3/3 =1 4/3 =1 5/3 = 1 ...

3-3. 0%3 = 0, 1 % 3 = 1, 2 %3 = 2, 3%3 =0, 4%3=1, ...

4. 해당 발화식으로 해답을 다음과 같이 출력할 수 있다.

 

 

import java.util.*;

class Solution {
   
    public long[] solution(int n, long left, long right) {
        int len = (int)(right-left);
        long [] answer = new long[len+1];
     
        int idx = 0;
        
        for (long i = left; i <= right; i++) {
            long row = i/n;
            long col = i%n;
            answer[idx++] = Math.max(row+1, col+1);
        }
        
        return answer;
    }
    
}