본문 바로가기

카테고리 없음

[프로그래머스] n^2 배열 자르기 : JAVA

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

 

프로그래머스

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

programmers.co.kr

문제 설명

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

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

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

 

(풀이코드)

class Solution {
    public int[] solution(int n, long left, long right) {
        	int li = (int)(left/n),lj = (int)(left%n);
	    	int A = (int)(right-left);
	        int[] answer = new int[A+1];
	        int a= 0; 
	        for(int i = 0; i<=A; i++) {
	        	answer[a++]= (li>lj?li:lj)+1;
	        	lj++;
	        	if(lj==n) {
	        		lj=0;li++; 
	        	}
	        }
	        return answer;
    }
}

 

(코드설명) 

// 
1. 먼저 n행n열 크기의 비어 있는 2차원 배열의 경우  행과 열 중 큰 값에 +1을 한 값을 넣은 게 배열에 들어간 값이다. 

이걸 이용해서 left~ right까지의 배열을 만든다면, 
우선 이 배열 answer의 크기는 right-left +1 이 배열의 크기가 된다. 이걸 A로 선언해주었다.

그리고 이 left의 값들이 무슨행 무슨열인지 알 기 위하여 left를 n으로 나눈 값이 행이 되고, n으로 나눈 나머지가 열이된다.
이걸 이용하면 
answer[] 에 A개(right-left+1) 의 값을 순차적으로 넣으면 된다. N으로 나누는 방식으로 비교를 해도 됬지만, 그냉 li 와 lj로 나눈 다음에 A개수로 돌도록 하였다. 

 

// 시행착오 
처음에  행렬을 만들고 그 안에 N*N의 값을 모두 넣은다음에 하니까 메모리 초과가 났다. 
그래서 다시 보니 규칙적으로 배열이 선언되어 있었기 떄문에 배열을 선언하지 않고 가능하였고, 이를 통해 풀 수 있었다. 

(효율성첨부)