본문 바로가기
자료구조 & 알고리즘

[코딩테스트] 프로그래머스 - n^2 배열 자르기 ( 자바스크립트 풀이 )

by PARADISE247 2024. 1. 21.
반응형

문제 설명

정수 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 함수를 완성해주세요.


제한사항

  • 1 ≤ n ≤ 107
  • 0 ≤ left ≤ right < n2
  • right - left < 105

 

입출력 예

n left right result
3 2 5 [3,2,2,3]
4 7 14 [4,3,3,3,4,4,4,4]

 

 

나의 풀이

function solution(n, left, right) {
  let answer = [];

  for (let i = left; i <= right; i++) {
    let x = parseInt(i / n) + 1;
    let y = parseInt(i % n) + 1;
    if (x === y) {
      answer.push(x);
    } else if (x > y) answer.push(x);
    else answer.push(y);
  }
  return answer;
}

 

n = 3, left = 2, right = 5 인 경우를 예제로 설명하겠다.

위는 문제에서 1.n행 n열 크기의 비어있는 2차원 배열을 만듭니다. 를 행했을때 만들어지는 2차원 배열이다.

이는 2차원 배열에서의 좌표를 나타낸다. 

위는 3. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다. 에서 생성된 배열의 모습이다.

그 중 밑의 배열은 2차원 배열에서의 좌표를 나타낸다. 

 

 

우리는 위와같이 생성된 1차원 배열 arr에서 arr[left], arr[left+1], ..., arr[right] 값을 구해야한다. arr에서 각각 자리에 해당하는 값을 알아내려면 해당 자리의 우선 좌표값을 알아내야 한다. 또한 배열 arr에서 left~right 범위만 탐색하면 되므로 

for (let i = left; i <= right; i++)

for문에서 조건은 변수 i에 대한 조건은 위 코드와 같다.

 

arr[i]의 값을 알아내려면 먼저 2차원 배열에서의 좌표값을 알아내야 한다.

좌표값을 (x,y)라고 할 경우, 

x = i / n + 1

y = i%n + 1

인 규칙을 가지고 있다. 규칙을 찾아내는 방법은 그냥 냅다 써보면 안다.

i = 0, 1, 2 → x = 1 

i = 3, 4, 5 → x = 2

i = 6, 7, 8 → x = 3

 

i = 0, 3, 6 → y = 1

i = 1, 4, 7 → y = 2

i = 2,, 5, 8 → y = 3

 

위와 같이 좌표값 규칙을 찾아내면, 이제 해당 좌표에 담긴 값을 알아내야 한다.

좌표에 담기게 되는 값도 좌표값에 따라 규칙을 가지게 된다. 

규칙은 다음과 같다. 

  • 좌표 (x,y)에서 x === y 인 경우 해당 좌표에 담긴 값은 x(=y)이다. 
  • 좌표 (x,y)에서 x < y 인 경우 (예: (1,2) = 2 , (1,3) = 3 )는 해당 좌표의 값은 y이다.
  • 좌표 (x,y)에서 x > y 인 경우 (예: (2,1) = 2 , (3,2) = 3 )는 해당 좌표의 값은 x이다.

위의 규칙대로 코드를 짜면 이와 같다. 

if (x === y) {
	answer.push(x);
} else if (x > y) answer.push(x);
  else answer.push(y);

 

설명한대로 규칙을 찾아내면 언급한 풀이대로 코드를 작성할 수 있다.

반응형