[JS][백준]16935_배열 돌리기3
Algorithm/BaeKJoon

[JS][백준]16935_배열 돌리기3

문제 번호

 

16935번: 배열 돌리기 3

크기가 N×M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다. 1번 연산은 배열을 상하 반전시키는 연산이다. 1 6 2 9 8 4 → 4 2 9 3 1 8 7 2 6 9 8 2 → 9 2 3 6 1 5 1 8 3 4 2 9 →

www.acmicpc.net

 

 

 

알고리즘 분류

 

문제 풀이

 문제를 잘 읽고 하라는대로 하면된다.

배열을 돌렸을때 가로와 세로가 바뀌는 것에 주의한다.

정확히 중간에 위치한 값들은 뒤집는 연산을 진행해도 그대로 유지되기 때문에 'parseInt(N/2)'와 'Math.ceil(N/2)'를 적절하게 사용하여 정 가운데 위치한 값은 건드리지 않도록 하였다.

 

전체코드

const input = require('fs').readFileSync('dev/stdin').toString().trim().split('\n');
let [N, M, R] = input[0].split(' ').map(Number);
let inputArr = input.slice(1, N + 1).map(_ => _.trim().split(' ').map(Number));
const C = input[1 + N].split(' ').map(Number);

function main() {
  let ans = inputArr;    
  for(let i=0; i<C.length; i++) {
    ans = sol(C[i],ans);
  }
  print(ans);
}
function sol(command, ans) {
  let ret = ans;
  switch (command) {
    case 1:
      ret = one(ret);
      break;
    case 2:
      ret = two(ret);
      break;
    case 3:
      ret = three(ret);
      break;
    case 4:
      ret = four(ret);
      break;
    case 5:
      ret = five(ret);
      break;
    case 6:
      ret = six(ret);
      break;
  }
  return ret;
}
function print(arr) {
  let answer = ''
  for (let i = 0; i < arr.length; i++) {
    answer += arr[i].join(' ') + '\n';
  }
  console.log(answer.trim());
}
function one(arr) {
  arr = arr.reverse();
  return arr;
}
function two(arr) {
  for (let i = 0; i < arr.length; i++) {
    arr[i] = arr[i].reverse();
  }
  return arr;
}
function three(arr) {
  N = arr.length;
  M = arr[0].length;
  let temp = new Array(M).fill(null).map(_ => new Array(N).fill(0));
  for (let i = 0; i < N; i++) {
    for (let j = 0; j < M; j++) {
      temp[j][N - (i + 1)] = arr[i][j];
    }
  }
  return temp;
}
function four(arr) {
  N = arr.length;
  M = arr[0].length;
  let temp = new Array(M).fill(null).map(_ => new Array(N).fill(0));
  for (let i = 0; i < N; i++) {
    for (let j = 0; j < M; j++) {
      temp[M - (j + 1)][i] = arr[i][j];
    }
  }
  return temp;
}
function five(arr) {  // 시계 돌리기.
  N = arr.length;
  M = arr[0].length;
  let temp = new Array(N).fill(null).map(_ => new Array(M).fill(0));
  for (let i = 0; i < N; i++) {
    for (let j = 0; j < M; j++) {
      temp[i][j] = arr[i][j];
    }
  }

  // 1 -> 2.
  for (let i = 0; i < parseInt(N / 2); i++) {
    for (let j = 0; j < parseInt(M / 2); j++) {
      temp[i][j + Math.ceil(M / 2)] = arr[i][j];
    }
  }
  // 2 -> 3.
  for (let i = 0; i < parseInt(N / 2); i++) {
    for (let j = Math.ceil(M / 2); j < M; j++) {
      temp[i + Math.ceil(N / 2)][j] = arr[i][j];
    }
  }
  // 3 -> 4.
  for (let i = Math.ceil(N / 2); i < N; i++) {
    for (let j = Math.ceil(M / 2); j < M; j++) {
      temp[i][j - Math.ceil(M / 2)] = arr[i][j];
    }
  }
  // 4 -> 1.
  for (let i = Math.ceil(N / 2); i < N; i++) {
    for (let j = 0; j < Math.ceil(M / 2); j++) {
      temp[i - Math.ceil(N / 2)][j] = arr[i][j];
    }
  }
  return temp;
}
function six(arr) {  //반 시계 돌리기.
  N = arr.length;
  M = arr[0].length;
  let temp = new Array(N).fill(null).map(_ => new Array(M).fill(0));
  for (let i = 0; i < N; i++) {
    for (let j = 0; j < M; j++) {
      temp[i][j] = arr[i][j];
    }
  }

  // 1-> 4.
  for (let i = 0; i < Math.ceil(N / 2); i++) {
    for (let j = 0; j < Math.ceil(M / 2); j++) {
      temp[i + Math.ceil(N / 2)][j] = arr[i][j];
    }
  }
  // 4->3.
  for (let i = Math.ceil(N / 2); i < N; i++) {
    for (let j = 0; j < Math.ceil(M / 2); j++) {
      temp[i][j + Math.ceil(M / 2)] = arr[i][j];
    }
  }
  // 3->2;
  for (let i = Math.ceil(N / 2); i < N; i++) {
    for (let j = Math.ceil(M / 2); j < M; j++) {
      temp[i - Math.ceil(N / 2)][j] = arr[i][j];
    }
  }
  // 2->1
  for (let i = 0; i < Math.ceil(N / 2); i++) {
    for (let j = Math.ceil(M / 2); j < M; j++) {
      temp[i][j - Math.ceil(M / 2)] = arr[i][j];
    }
  }

  return temp;
}
main();

 

특이사항

 긴 구현문제를 풀때는 항상 침착하게 풀자.