프로그래머스 (2021 Dev-Matching: 웹 백엔드 개발자(상반기)) 문제

KHW·2021년 4월 4일
0

알고리즘

목록 보기
16/37

문제

매개변수로 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;    //최솟값들의 배열 리턴
}

시험 후 확인을 예시밖에 할 수없지만 일단 정상적으로 동작하고 따로 문제있는 부분은 없는 것 같다.


코드분석

solution 코드

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


check 코드

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);     //반환한 최솟값 추가
  }

좀더 보기 좋게 바꿀수 있다.

profile
나의 하루를 가능한 기억하고 즐기고 후회하지말자

0개의 댓글