백준 - 알고리즘 기초 1/2 ( 201 - 자료구조 1 ( 참고 ) )

박상은·2022년 8월 8일
0

🤔 알고리즘 🤔

목록 보기
16/19

백준 알고리즘 기초 강의에 명시된 문제를 풀이한 포스트입니다

1. 1918번 - 후위 표기식

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

let input = "";

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

  rl.close();
}).on("close", () => {
  /**
   * 중위 표기식에서 후위 표기식 변환 방법
   * 1. 피연산자는 바로 출력
   * 2. 연산자는 스택의 상태에 따라 출력
   *   2.1 스택이 비었다면 스택에 넣기
   *   2.2 연산자 우선순위가 낮은 연산자 or 닫는 괄호를 만날 때까지 "pop()" 실행 후 스택에 넣기
   *   2.3 닫는 괄호라면 여는 괄호가 나올 때까지 "pop()" 실행
   * 3. 수식의 끝까지 왔다면 스택의 연산자들을 모두 꺼냄
   */

  const stack = [];
  let answer = "";

  input.split("").forEach((v) => {
    // 연산자라면
    if (v.match(/[\(\)\+\*\-\/]/)) {
      // 2. 연산자는 스택의 상태에 따라 출력
      switch (v) {
        case "(":
          stack.push(v);
          break;
        case ")":
          // 2.3 닫는 괄호라면 여는 괄호가 나올 때까지 "pop()" 실행
          while (stack.length && stack[stack.length - 1] !== "(") {
            answer += stack.pop();
          }
          stack.pop();
          break;
        case "+":
        case "-":
          // 2.2 연산자 우선순위가 낮은 연산자를 만날 때까지 "pop()" 실행 후 스택에 넣기 ( "+", "-"는 우선순위가 제일 낮아서 비교할 필요 없이 닫는 괄호가 나오는지만 확인하면 됨 )
          while (stack.length && stack[stack.length - 1] !== "(") {
            answer += stack.pop();
          }
          stack.push(v);
          break;
        case "*":
        case "/":
          // 2.2 연산자 우선순위가 낮은 연산자를 만날 때까지 "pop()" 실행 후 스택에 넣기 ( "*", "/"만 비교하므로 닫는 괄호를 생각해 줄 필요 없음 )
          while (
            stack.length &&
            (stack[stack.length - 1] === "*" || stack[stack.length - 1] === "/")
          ) {
            answer += stack.pop();
          }
          stack.push(v);
          break;
      }
    }
    // 피연산자라면
    else {
      // 1. 피연산자는 바로 출력
      answer += v;
    }
  });

  // 3. 수식의 끝까지 왔다면 스택의 연산자들을 모두 꺼냄
  while (stack.length) answer += stack.pop();

  console.log(answer);

  process.exit();
});

2. 1935번 - 후위 표기식2

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[0] + 2 === input.length) rl.close();
}).on("close", () => {
  /**
   * 후위 표현식 계산법
   * 1. 피연산자는 스택에 넣는다.
   * 2. 연산자가 나올 경우 스택에서 피연산자 2개를 꺼낸 후 계산한 뒤 다시 넣는다. ( 단, 연산 순서는 "나중" "연산자" "먼저" )
   * 3. 모든 연산이 끝난 후 스택에 담겨있는 피연산자가 연산의 결과다.
   */

  const [, expression, ...temp] = input;
  const values = temp.map((v) => +v);
  const stack = [];
  let firstValue = null;
  let lastValue = null;

  expression.split("").forEach((v) => {
    // 연산자일 경우
    if (v.match(/[\+\-\*\/]/)) {
      lastValue = stack.pop();
      firstValue = stack.pop();

      switch (v) {
        case "+":
          stack.push(firstValue + lastValue);
          break;
        case "-":
          stack.push(firstValue - lastValue);
          break;
        case "*":
          stack.push(firstValue * lastValue);
          break;
        case "/":
          stack.push(firstValue / lastValue);
          break;
      }
    }
    // 피연산자일 경우
    else {
      stack.push(values[v.charCodeAt() - 65]);
    }
  });

  console.log(stack[0].toFixed(2));

  process.exit();
});

3. 10808번 - 알파벳 개수

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 alphabet = Array(26).fill(0);
  const word = input;

  word.split("").forEach((v) => (alphabet[v.charCodeAt() - 97] += 1));

  console.log(alphabet.join(" "));

  process.exit();
});

4. 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", () => {
  const alphabet = Array(26).fill(-1);
  const word = input;

  word.split("").forEach((v, i) => {
    if (alphabet[v.charCodeAt() - 97] !== -1) return;

    alphabet[v.charCodeAt() - 97] = i;
  });

  console.log(alphabet.join(" "));

  process.exit();
});

5. 10820번 - 문자열 분석

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

const input = [];
let temp = null;
let answer = "";
const table = {
  upper: 0,
  lower: 0,
  number: 0,
  space: 0,
};

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

  // rl.close();
}).on("close", () => {
  // 전체 탐색
  input.forEach((str, i) => {
    // 문장 단위로 탐색
    str.split("").forEach((v) => {
      temp = v.charCodeAt();

      if (temp >= 97 && temp <= 122) table.upper++;
      if (temp >= 65 && temp <= 90) table.lower++;
      if (temp >= 48 && temp <= 57) table.number++;
      if (temp === 32) table.space++;
    });

    // 문장 탐색 후 정답 작성
    answer += Object.values(table).join(" ");

    // 마지막 아니면 줄바꿈
    if (i !== input.length - 1) answer += "\n";

    // 초기화
    Object.keys(table).forEach((key) => (table[key] = 0));
  });

  console.log(answer);

  process.exit();
});

6. 2743번 - 단어 길이 재기

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

const input = [];

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

  rl.close();
}).on("close", () => {
  const [word] = input;

  console.log(word.length);

  process.exit();
});

0개의 댓글