_우지 2022. 7. 6. 11:52

 

문제링크

 

20436번: ZOAC 3

첫 번째 줄에는 두 알파벳 소문자 sL, sR이 주어진다. sL, sR은 각각 왼손 검지손가락, 오른손 검지손가락의 처음 위치이다. 그 다음 줄에는 알파벳 소문자로 구성된 문자열이 주어진다. 문자열의

www.acmicpc.net

 

배운점

자바스크립트에서 ["q", "w", "e", "r", "t", "y", "u", "i", "o", "p"] 의 배열에서 w 문자가 몇번째 인덱스인지 알려면 어떻게 해야할까요?

더보기
let 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"],
];

y = keyboard[0].indexOf(key);
console.log(y)

indexOf 메소드를 사용하면 됩니다.

자바스크립트에서 여러개의 변수를 리턴하고 싶다면 어떻게 해야할까요?

더보기
const returnXY = (key) => {
  let x, y;
  for (let i = 0; i < 3; i++) {
    y = keyboard[i].indexOf(key);
    if (y !== -1) {
      x = i;
      break;
    }
  }
  return [x, y]; // 배열로 리턴
};

let [a, b] = returnXY("q"); // 리턴 값 받을 때

주석에 주목해주세요!

 

만약 다음과 같이 key_x , key_y 값을 미리 선언을 해두었는데 어떤 함수의 리턴이 복수변수라면 어떻게 받아야할까요?

let key_x, key_y;
더보기
let key_x, key_y;
[key_x, key_y] = returnXY("q");

 

그리고 어차피 indexOf 를 사용할때 배열과 string 에 모두 사용할 수 있기때문에 1번 처럼 키보드 배열을 만드는 것 보다 2번 처럼 만드는 것이 더 수월하다.

let 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"],
]; //1 

let keyboard = ["qwertyuiop", "asdfghjkl", "zxcvbnm"]; //2

 

문제풀이

  1. 키의 좌표를 반환하는 함수를 만든다.
  2. 키를 입력해야할때마다 입력해야하는 키의 좌표와 현재 왼손 또는 오른손의 좌표를 리턴받는다.
  3. 택시거리를 계산하고 +1 (입력시 걸리는 시간) 까지 포함하여 더해준다.
  4. left 또는 right를 누른 키 값으로 갱신한다.
const fs = require("fs");

BOJkey = 1;

let input = fs
  .readFileSync(BOJkey ? "./자바스크립트로/20436/input.txt" : "./dev/stdin")
  .toString()
  .trim()
  .split("\n");

// console.log(input);
let keyboard = ["qwertyuiop", "asdfghjkl", "zxcvbnm"];
let ja = "qwertasdfgzxcv";
let key;
let [left, right] = input[0].split(" ");

const returnXY = (key) => {
  let x, y;
  for (let i = 0; i < 3; i++) {
    y = keyboard[i].indexOf(key);
    if (y !== -1) {
      x = i;
      break;
    }
  }
  return [x, y];
};

let key_x, key_y;
let result = 0;
for (let i = 0; i < input[1].length; i++) {
  key = input[1][i];

  if (ja.includes(key)) {
    [key_x, key_y] = returnXY(key);
    [left_x, left_y] = returnXY(left);
    result += Math.abs(key_x - left_x) + Math.abs(key_y - left_y) + 1;
    left = key;
  } else {
    [key_x, key_y] = returnXY(key);
    [right_x, right_y] = returnXY(right);
    result += Math.abs(key_x - right_x) + Math.abs(key_y - right_y) + 1;
    right = key;
  }
}

console.log(result);