매개변수로 rows, columns, queries가 주어질때 해당 스핀에서 최솟값의 모음인 배열을 리턴하기
ex)
solution(6,6,[[2,2,5,4],[3,3,6,6],[5,1,6,3]]))의 매개변수 형태라면 3번의 반복을 통해 [8,10,25]을 리턴해야한다.
function check(arr,a,b,c,d)
{
let beforeNum = arr[a+1][b]; //시작 변환 값 미리 지정
let min= arr[a+1][b]; //시작 변환 값으로 최솟값지정
let x = a , y = b; //움직이는 x,y 위치 지정
const repeatNum = (c-a+1)*(d-b+1) - (c-a-1)*(d-b-1); //진행하는 횟수 지정
for(let i=0;i<repeatNum;i++)
{
min = Math.min(arr[x][y],min); //기존에 존재하는 값과 이전 값의 비교 후 최솟 값 반환
[beforeNum,arr[x][y]] = [arr[x][y],beforeNum]; //기존 값과 이전에 가진 값 교환
if(y<d && x == a) //오른쪽 방향진행
y++;
else if(y==d && x<c) //아래 방향 진행
x++;
else if(x==c && b<y) //왼쪽 방향진행
y--;
else //위로 방향 진행
x--;
}
return [arr,min]; //해당 변한 배열과 최솟값 반환
}
function solution(rows, columns, queries) {
let arr = Array.from(Array(rows), () => new Array(columns));
let num = 1;
let result = [];
let min;
for(let i=0;i<rows;i++)
for(let j=0;j<columns;j++)
arr[i][j] = num++;
for(let i=0;i<queries.length;i++)
{
[arr,min] = check(arr,queries[i][0]-1,queries[i][1]-1,queries[i][2]-1,queries[i][3]-1); //반환 값 리턴
result.push(min); //반환한 최솟값 추가
}
return result; //최솟값들의 배열 리턴
}
시험 후 확인을 예시밖에 할 수없지만 일단 정상적으로 동작하고 따로 문제있는 부분은 없는 것 같다.
function solution(rows, columns, queries) { //(1)
let arr = Array.from(Array(rows), () => new Array(columns));
let num = 1;
let result = [];
let min;
for(let i=0;i<rows;i++) //(2)
for(let j=0;j<columns;j++)
arr[i][j] = num++;
for(let i=0;i<queries.length;i++) //(3)
{
[arr,min] = check(arr,queries[i][0]-1,queries[i][1]-1,queries[i][2]-1,queries[i][3]-1); //반환 값 리턴
result.push(min); //반환한 최솟값 추가
}
return result; //최솟값들의 배열 리턴
}
(1) rows와 columns의 값에 해당하는 행과열을 포함한 배열인 arr 생성
기본 arr배열에 값을 넣기위한 num생성 및 result, min생성
(2) for문을 통해 arr 배열을 채운다.
(3) for문을 통해 queries의 내용만큼 진행하면서 해당 check함수를 실행 후 arr을 변화해주고 최솟값을 result에 push
function check(arr,a,b,c,d)
{ //(1)
let beforeNum = arr[a+1][b]; //시작 변환 값 미리 지정
let min= arr[a+1][b]; //시작 변환 값으로 최솟값지정
let x = a , y = b; //움직이는 x,y 위치 지정
const repeatNum = (c-a+1)*(d-b+1) - (c-a-1)*(d-b-1); //진행하는 횟수 지정
for(let i=0;i<repeatNum;i++)
{
//(2)
min = Math.min(arr[x][y],min); //기존에 존재하는 값과 이전 값의 비교 후 최솟 값 반환
[beforeNum,arr[x][y]] = [arr[x][y],beforeNum]; //기존 값과 이전에 가진 값 교환
//(3)
if(y<d && x == a) //오른쪽 방향진행
y++;
else if(y==d && x<c) //아래 방향 진행
x++;
else if(x==c && b<y) //왼쪽 방향진행
y--;
else //위로 방향 진행
x--;
}
return [arr,min]; //해당 변한 배열과 최솟값 반환
}
(1) 바꿀 시작 값 미리 설정 및 최솟값으로도 지정(for문을 통해 값 변경), 움직이는 x,y생성 및 횟수 계산
(2) 기존값과 이전 값의 비교 및 최솟값찾기 반복
(3) 해당방향마다 진행하되 주의할 점은 진행방향의 마지막 끝이 되면 실행하지않고 다른 방향 실행을 해야한다. (그래서 y<d, x<c b<y와 같이 =조건을 붙이지않았다.)
console.log(JSON.stringify([8,10,25])===JSON.stringify(solution(6,6,[[2,2,5,4],[3,3,6,6],[5,1,6,3]])));
해당 결과는 true가 되고
JSON.stringify(배열) 을 이용한다.
for(let i=0;i<queries.length;i++) //(3)
{
[arr,min] = check(arr,queries[i][0]-1,queries[i][1]-1,queries[i][2]-1,queries[i][3]-1); //반환 값 리턴
result.push(min); //반환한 최솟값 추가
}
for(let i in queries)
{
[arr,min] = check(arr,queries[i][0]-1,queries[i][1]-1,queries[i][2]-1,queries[i][3]-1); //반환 값 리턴
result.push(min); //반환한 최솟값 추가
}
좀더 보기 좋게 바꿀수 있다.