1. 11654번 - 아스키코드

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = null;

rl.on("line", line => {
  input = line;

  rl.close();
}).on("close", () => {
  console.log(input.charCodeAt());

  process.exit();
});

2. 11720번 - 숫자의 합

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = [];

rl.on("line", line => {
  input.push(line);

  if (input.length >= 2 && input[1].length === +input[0]) rl.close();
}).on("close", () => {
  const answer = input[1].split("").reduce((prev, curr) => prev + +curr, 0);

  console.log(answer);

  process.exit();
});

3. 10809번 - 알파벳 찾기

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = null;

rl.on("line", line => {
  input = line;

  rl.close();
}).on("close", () => {
  let answer = "";
  const array = Array(26)
    .fill()
    .map(() => -1);

  input.split("").forEach((v, i) => (array[v.charCodeAt() - 97] === -1 ? (array[v.charCodeAt() - 97] = i) : null));

  array.forEach(v => (answer += `${v} `));

  console.log(answer);

  process.exit();
});

4. 2675번 - 문자열 반복

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = [];

rl.on("line", line => {
  input.push(line);

  if (input.length >= 2 && input.length - 1 === +input[0]) rl.close();
}).on("close", () => {
  input.shift();
  let answer = "";
  let output = input.map(value => {
    // 반복횟수와 반복문자열 분리
    const tempArray = value.split(" ");

    return tempArray[1].split("").map(v => {
      let tempString = "";
      for (let i = 0; i < +tempArray[0]; i++) {
        tempString += v;
      }
      return tempString;
    });
  });

  output.forEach(v => (answer += `${v.join("")}\n`));

  console.log(answer);

  process.exit();
});

5. 1157번 - 단어 공부

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = null;

rl.on("line", line => {
  input = line;

  rl.close();
}).on("close", () => {
  let maxValue = 0;
  let count = 0;
  const array = Array(26)
    .fill()
    .map(() => 0);

  input
    .toUpperCase()
    .split("")
    .forEach(v => array[v.charCodeAt() - 65]++);

  maxValue = array.reduce((prev, curr) => (prev > curr ? prev : curr));

  array.forEach(v => (v === maxValue ? count++ : null));

  console.log(count >= 2 ? "?" : String.fromCharCode(array.indexOf(maxValue) + 65));

  process.exit();
});

6. 1152번 - 단어의 개수

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = null;

rl.on("line", line => {
  input = line;

  rl.close();
}).on("close", () => {
  const answer = input.trim().split(" ").length;

  console.log(input === " " ? 0 : answer);

  process.exit();
});

7. 2908번 - 상수

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = null;

rl.on("line", line => {
  input = line;

  rl.close();
}).on("close", () => {
  const temp = input.split(" ");
  const frontValue = temp[0].split("").reverse().join("");
  const backValue = temp[1].split("").reverse().join("");

  console.log(+frontValue > +backValue ? frontValue : backValue);

  process.exit();
});

8. 5622번 - 다이얼

/**
 * A ~ Z까지 8개의 구역으로 나눔
 * 3, 3, 3, 3, 3, 4, 3, 4  (개)
 * 3, 4, 5, 6, 7, 8, 9, 10 (초)
 *
 * 앞 5개는 3개씩 일관성 있게 처리하고
 * 나머지 3개는 다르게 처리
 */
const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = null;

rl.on("line", line => {
  input = line;

  rl.close();
}).on("close", () => {
  const array = Array(8)
    .fill()
    .map(() => 0);

  input.split("").forEach(v => {
    const code = v.charCodeAt() - 65;
    const index = Math.floor(code / 3);

    // 일반 처리
    if (code < 15) {
      array[index]++;
    } else {
      switch (code) {
        case 15:
        case 16:
        case 17:
        case 18:
          array[5]++;
          break;
        case 19:
        case 20:
        case 21:
          array[6]++;
          break;
        case 22:
        case 23:
        case 24:
        case 25:
          array[7]++;
          break;

        default:
          break;
      }
    }
  });

  const answer = array.reduce((prev, curr, index) => curr * (index + 3) + prev, 0);

  console.log(answer);

  process.exit();
});

9. 2941번 - 크로아티아 알파벳

처음에 생각했던 방법은 최초에 입력한 문자열에서 크로아티아 알파벳(이후 ca)를 찾을 때마다 slice()를 이용해서 ca만 제거하는 방법으로 계속 처리하려고 했다.

하지만 생각지 못했던 문제가 ddz=z=같은 문자열은 dz=를 제거하면 또 dz=이 남아서 두 번 체크해버리는 문제가 생겼다.

그래서 다른 방법으로 indexOf()의 두 번째 인자인 index부분을 이용해서 앞서 확인했던 ca 이후부터 다시 검사하는 방식으로 ca의 개수만 세고 문자열에서 제거하지는 않으며 동시에 제거해야 할 개수만 업데이트하면서 마지막 남은 문자열의 개수와 ca의 개수를 구하는 방식을 취했다.

그런데 또 생각하지 못했던 문제가 dz=같은 경우에는 dz=z=에서 두 번 걸려버리는 문제가 발생해서 특별하게 조건 처리를 이용해서 해결했다. ( 조금은 하드코딩을 한 것처럼 느껴짐 )

/**
 * 크로아티아 알파벳을 포함하면 잘라서 없애고 count++
 * 크로아티아 알파벳의 개수 => 크로아티아 알파벳 개수
 * 전체 문자열 길이 - 크로아티아 알파벳 개수 => 남은 문자열 개수
 * 정답 => 크로아티아 알파벳 개수 + 남은 문자열 개수
 * 추가로 "dz="과 "z="은 중복되는 부분이 존재해서 특별처리해줌
 */
const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = null;
let inputStringLength = 0;
let count = 0;
const testFunc = (string, candidate, index = 0) => {
  if (string.includes(candidate, index)) {
    const startIndex = string.indexOf(candidate, index);
    const lastIndex = startIndex + candidate.length;
    index = lastIndex;
    inputStringLength -= candidate.length;
    count++;

    // "dz="과 "z="의 처리때문에
    if (candidate === "dz=") {
      count--; // "z="에서 count + 1 하기때문에
      inputStringLength += 2; // "dz="에서 -3, "z="에서 -2 이기 때문에 이후에 -2할꺼 미리 +2해서 상쇄
    }
  }

  // 재귀
  if (string.includes(candidate, index)) testFunc(string, candidate, index);
};

rl.on("line", line => {
  input = line;

  rl.close();
}).on("close", () => {
  // 크로아티아 알파벳들
  const array = ["c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="];
  inputStringLength = input.length;

  array.forEach(v => {
    testFunc(input, v);
  });

  console.log(inputStringLength + count);

  process.exit();
});

10. 1316번 - 그룹 단어 체커

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = [];
let checkArray = [];
let checkIndex = -1;
let isGroupWord = false;
let count = 0;

rl.on("line", line => {
  input.push(line);

  if (input.length >= 2 && input.length - 1 === +input[0]) rl.close();
}).on("close", () => {
  input.shift();

  input.forEach(value => {
    checkArray = [];
    checkIndex = -1;
    // every를 사용해서 모두 false반환하는 즉시 반복 종료
    isGroupWord = value.split("").every(v => {
      // 최초 등장한 단어라면 체크 배열에 추가 및 인덱스 지정
      if (!checkArray.includes(v)) {
        checkArray.push(v);
        checkIndex++;
        return true;
      } else {
        // 이전에 등장했다면 바로 이전에 등장한건지 확인
        if (v === checkArray[checkIndex]) return true;
        else return false;
      }
    });

    isGroupWord ? count++ : null;
  });

  console.log(count);

  process.exit();
});

0개의 댓글