[백준] 20436번 : ZOAC3 (node.js)

Jo Chang Uk·2024년 5월 10일

1. 문제

문제 링크

2. 풀이

2.1 생각해 볼 만한 케이스

  • 자음은 왼손, 모음은 오른손
  • 거리 |x1-x2|+|y1-y2|
var fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");

const left = input[0].split(" ")[0];
const right = input[0].split(" ")[1];
const words = input[1].split("");

// 모음
const rights = "yuiophjklbnm";

const keyBoard = [
  ["q", "w", "e", "r", "t", "y", "u", "i", "o", "p"],
  ["a", "s", "d", "f", "g", "h", "j", "k", "l"],
  ["z", "x", "c", "v", "b", "n", "m"],
];

// 문자가 모음(오른쪽)인지 확인 함수
function isRight(x) {
  for (let i = 0; i < rights.length; i++) {
    if (x === rights[i]) return true;
  }
  return false;
}

// 문자를 받아 위치 좌표를 반환하는 함수
function getIndex(x) {
  for (let i = 0; i < keyBoard.length; i++) {
    for (let j = 0; j < keyBoard[i].length; j++) {
      if (x === keyBoard[i][j]) return (x = [i, j]);
    }
  }
}

function solution(left, right, words) {
  let answer = 0;
  // 왼손, 오른손 좌표화
  left = getIndex(left);
  right = getIndex(right);
  for (let x of words) {
    // 오른쪽인지 확인
    let position = isRight(x);
    // 좌표화
    x = getIndex(x);

    if (position) {
      // 오른쪽 일때 거리만큼 answer에 누적
      answer += Math.abs(right[0] - x[0]) + Math.abs(right[1] - x[1]);
      // 키 누를때 1회
      answer++;
      // 오른쪽 위치 변경
      right = x;
    } else {
      // 왼쪽
      answer += Math.abs(left[0] - x[0]) + Math.abs(left[1] - x[1]);
      answer++;
      left = x;
    }
  }
  return answer;
}

console.log(solution(left, right, words));

0개의 댓글