백준 1283 - 단축키 지정

문제

한글 프로그램의 메뉴에는 총 N개의 옵션이 있다. 각 옵션들은 한 개 또는 여러 개의 단어로 옵션의 기능을 설명하여 놓았다. 그리고 우리는 위에서부터 차례대로 각 옵션에 단축키를 의미하는 대표 알파벳을 지정하기로 하였다. 단축키를 지정하는 법은 아래의 순서를 따른다.

먼저 하나의 옵션에 대해 왼쪽에서부터 오른쪽 순서로 단어의 첫 글자가 이미 단축키로 지정되었는지 살펴본다. 만약 단축키로 아직 지정이 안 되어있다면 그 알파벳을 단축키로 지정한다. 만약 모든 단어의 첫 글자가 이미 지정이 되어있다면 왼쪽에서부터 차례대로 알파벳을 보면서 단축키로 지정 안 된 것이 있다면 단축키로 지정한다. 어떠한 것도 단축키로 지정할 수 없다면 그냥 놔두며 대소문자를 구분치 않는다. 위의 규칙을 첫 번째 옵션부터 N번째 옵션까지 차례대로 적용한다.

접근

  1. 단어 첫 글자를 확인한다. (공백으로 구분하여 판단함)
    1. 만약 지정된 단축키가 없다면 해당 알파벳을 단축키로 지정한다.
  2. 첫 글자가 이미 모두 지정되어있다면, 왼쪽부터 차례대로
  3. 그래도 없다면 그냥 내버려둠

대소문자 구분 안함

이런 이유로 Set을 사용해서 풀기로 했다.

또한 1번과 2번을 한번에 판단하는건 머리아프니까

1번 과정을 수행하고 1번에서 실패한 경우 2번 과정으로 진행될 수 있게 코드를 구성했하기로 했다.

그리고 단축키를 set에 넣는것 보다 어려운 문자열 수정하기

substring을 통해 진행

const input = require("fs")
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .replace(/\r/g, "")
  .split("\n");

const N = input[0];

const OPP = input.slice(1);

const ans = [];
const sc = new Set();

for (let opt of OPP) {
  let found = false;

  const words = opt.split(" ");

  let tmpOpt = [...words];
  for (let i = 0; i < words.length; i++) {
    const word = words[i];
    // 첫 글자 따와서 집어넣기
    if (word.length > 0) {
      const firstChar = word[0];
      const lowerFirst = firstChar.toLowerCase();

      if (!sc.has(lowerFirst)) {
        found = true;
        // [] 붙여주기
        tmpOpt[i] = `[${firstChar}]` + word.substring(1);
        sc.add(lowerFirst);
        ans.push(tmpOpt.join(" "));
        break;
      }
    }
  }
  if (found) {
    continue;
  }

  let charIdx = -1;

  for (let j = 0; j < opt.length; j++) {
    const char = opt[j];

    if (char === " ") {
      continue;
    }

    const lowerChar = char.toLowerCase();

    if (!sc.has(lowerChar)) {
      found = true;
      sc.add(lowerChar);
      charIdx = j;
      break;
    }
  }

  if (found) {
    const newOpt =
      opt.substring(0, charIdx) +
      `[${opt[charIdx]}]` +
      opt.substring(charIdx + 1);
    ans.push(newOpt);
  } else {
    ans.push(opt);
  }
}

console.log(ans.join("\n"));

결론

생각대로 막 집어넣고, 만지면서 푼 문제라서 그런지 코드가 영 지저분함.

조금 진정하고 천천히 풀면 무난하게 풀 수 있는 문제.