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

박상은·2022년 7월 24일
0

🤔 알고리즘 🤔

목록 보기
15/19

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

1. 17413번 - 문자열 뒤집기 2

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 regex = /(<[\w\s]+>)/g;
  // "< ... >"을 기준으로 분리
  const temp = input.join("").split(regex);

  const answer = temp
    .map((v) => {
      // "< ... >"이면 무시
      if (v.includes("<") || v.includes(">")) return v;

      // 그게 아니라면 순서 뒤집기
      return v
        .split(" ")
        .map((w) => w.split("").reverse().join(""))
        .join(" ");
    })
    .join("");

  console.log(answer);

  process.exit();
});

2. 10799번 - 쇠막대기

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이 된다.
   */

  const temp = input.split("");
  const sticks = [];
  let answer = 0;

  temp.forEach((v, i, array) => {
    // 레이저인지 막대기인지 불분명함, 일단 막대기에 넣고 이후에 종류에 맞게 처리
    if (v === "(") sticks.push(v);
    else {
      // 레이저
      if (array[i - 1] === "(") {
        sticks.pop();
        answer += sticks.length;
      }
      // 막대기 끝
      else {
        sticks.pop();
        answer++;
      }
    }
  });

  console.log(answer);

  process.exit();
});

3. 17298번 - 오큰수

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

const input = [];

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

  if (input.length >= 2 && input[1].split(" ").length === +input[0]) rl.close();
}).on("close", () => {
  // 입력 받은 숫자의 역순으로 확인 ( 효율성을 위해서 )
  const target = input[1]
    .split(" ")
    .map((v) => +v)
    .reverse();
  const stack = [];
  const answer = [];

  // 역순으로 확인함을 인지
  target.forEach((v, i) => {
    // 제일 마지막 숫자는 오큰수가 존재할 수 없기 때문에 항상 -1
    if (i === 0) answer.push(-1);
    else {
      // 스택에서 현재 숫자보다 작은 숫자 모두 제외 ( 현재 숫자보다 작으면서 더 우측에 있는 숫자는 오큰수가 될 수 없음 )
      // 동일한 숫자도 제외해야 함
      while (v >= stack[stack.length - 1]) stack.pop();

      // 스택이 모두 비었다면 오큰수가 존재하지 않기 때문에 -1
      if (stack.length === 0) answer.push(-1);
      // 스택에 숫자가 존재한다면 최상위에 존재하는 숫자가 오큰수
      else answer.push(stack[stack.length - 1]);
    }

    // 현재 숫자를 스택에 넣어주기
    stack.push(v);
  });

  console.log(answer.reverse().join(" "));

  process.exit();
});

4. 17299번 - 오큰등수

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

const input = [];

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

  if (input.length >= 2 && input[1].split(" ").length === +input[0]) rl.close();
}).on("close", () => {
  // 입력 받은 숫자의 역순으로 확인 ( 효율성을 위해서 )
  const target = input[1]
    .split(" ")
    .map((v) => +v)
    .reverse();
  const stack = [];
  const answer = [];
  // 오큰수와 같은 원리지만 비교를 위한 테이블 생성 ( 각 숫자의 개수를 구함... F(1), F(2) 등등 )
  const table = [];
  target.forEach((v) => {
    if (!table[v]) table[v] = 0;

    table[v]++;
  });

  // 역순으로 확인함을 인지
  target.forEach((v, i) => {
    // 제일 마지막 숫자는 오큰등수가 존재할 수 없기 때문에 항상 -1
    if (i === 0) answer.push(-1);
    else {
      // 스택에서 현재 숫자보다 작은 숫자 모두 제외 ( 현재 숫자보다 작으면서 더 우측에 있는 숫자는 오큰등수가 될 수 없음 )
      // 오큰등수이기 때문에 테이블을 이용해서 비교
      while (table[v] >= table[stack[stack.length - 1]]) stack.pop();

      // 스택이 모두 비었다면 오큰등수가 존재하지 않기 때문에 -1
      if (stack.length === 0) answer.push(-1);
      // 스택에 숫자가 존재한다면 최상위에 존재하는 숫자가 오큰등수
      else answer.push(stack[stack.length - 1]);
    }

    // 현재 숫자를 스택에 넣어주기
    stack.push(v);
  });

  console.log(answer.reverse().join(" "));

  process.exit();
});

5. 11655번 - ROT13

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 string = input;
  let answer = [];
  let temp = null;

  string.split("").map((v, i) => {
    temp = v.charCodeAt();

    // 소문자일 경우
    if (temp >= 97 && temp <= 122) {
      // 범위 초과 ( -1 이유는 97부터 "a"이기 때문에 )
      if (temp + 13 > 122) answer.push(97 + temp + 13 - 122 - 1);
      else answer.push(temp + 13);
    }

    // 대문자일 경우
    if (temp >= 65 && temp <= 90) {
      if (temp + 13 > 90) answer.push(65 + temp + 13 - 90 - 1);
      else answer.push(temp + 13);
    }

    // 알파벳이 아닐 경우
    if (answer.length !== i + 1) answer.push(temp);
  });

  console.log(String.fromCharCode(...answer));

  process.exit();
});

6. 10824번 - 네 수

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 [x, y, z, r] = input.split(" ");
  const answer = +(x + y) + +(z + r);

  console.log(answer);

  process.exit();
});

7. 11656번 - 접미사 배열

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 = [];
  const word = input;

  // 하나씩 잘라서 배열에 넣기
  word.split("").forEach((v, i) => answer.push(word.slice(i)));
  // 알파벳순으로 정렬
  answer.sort();

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

  process.exit();
});

0개의 댓글