[node.js] 백준 조건문 풀이 모음

송히·2023년 1월 10일
0
post-thumbnail

조건문 풀이 모음

: node.js를 이용한 백준 단계별로 풀어보기


🔍 1330번: 두 수 비교하기

클릭해서 문제 전체 보기🔼

📖 풀이 코드

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");

let inputArr;
for (let i = 0; i < input.length; i++) {
  inputArr = input[i].split(" ").map((item) => +item);
}

function solution(inputArr) {
  if (inputArr[0] > inputArr[1]) return ">";
  if (inputArr[0] < inputArr[1]) return "<";
  return "==";
}

console.log(solution(inputArr));

💚 추가 학습~
클린 코드를 작성하기 위한 방법 중 하나로 if문 사용 시 else의 지양이 있다.
이는 else 대신 if문에서 바로 return or 실행시키면 해결할 수 있고, Early Return이라고 한다.

else 지양의 이유로는 가독성 올라감, 한 함수가 여러 기능을 할 때 else를 사용하면 하나에만 적용될 위험 있음가 있다.
빨리 거를 수 있는 조건으로 Early Return 시키면, 굳이 뒤의 조건들까지 보지 않아도 되므로 코드가 명확해진다.

예를 들어 내가 올리브영 알바생이라고 생각해보자. 손님 A가 물건 위치를 물어보면 찾아드려야 한다. 그리고 손님 B가 들어온다면 "어서오세요 올리브영입니다"를 외쳐야한다. 물건을 찾아드리는 건 위치를 물어봤을 때만 실행해야한다. 하지만 인사는 손님이 들어올 때마다 항상 해야한다. 이를 else를 사용한 코드로 나타내면 아래와 같다.
function B손님이_가게에_들어옴() {
  if(A손님이_물건_위치_물어봄) {
    물건을_찾아드린다;
  } else {
    어서오세요_올리브영입니다_로_인사한다;
  }
};
🔼위 코드를 실행하면 물건을 찾아드리는 중이면 인사는 못한다. 우리는 물건을 찾으면서 인사도 하는 상황을 원한다.
function B손님이_가게에_들어옴() {
  if (A손님이_물건_위치_물어봄) { 
    물건을_찾아드린다;
  }
  return 어서오세요_올리브영입니다_로_인사한다;
};
🔼위 코드를 실행하면 손님이 물건 위치 물어봄 -> if( A손님이 물건 위치 물어봄 ) { 물건을 찾아드린다; } 로 물건 찾기 실행 후, 다음인 인사하기로 넘어갈 수 있다. 이 때는 물건 찾기의 실행 여부와 상관없이 항상 인사를 할 수 있다.

특히 else if문은 else { if(true) { aa; } }와 같기 때문에, else 처리 후 그 안에서 if문이 또 시작되는 것이다.
조건을 많이 추가해야한다면 if문 대신 switch문을 사용하는 것도 한 방법이다.

하지만 상황에 따라 else를 사용하는 경우가 더 좋을 때도 있으므로, 상황에 맞게 사용하는 것이 중요하다.


🔍 9498번: 시험 성적

클릭해서 문제 전체 보기🔼

📖 풀이 코드

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");

function solution(input) {
  if (90 <= input) return "A";
  if (80 <= input) return "B";
  if (70 <= input) return "C";
  if (60 <= input) return "D";
  return "F";
}

console.log(solution(+input));

📢 풀이 설명
else 사용 대신 Early Return방식을 사용하였다.


🔍 2753번: 윤년

클릭해서 문제 전체 보기🔼

📖 풀이 코드

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");

function solution(input) {
  if (input % 100 == 0) {
    if (Math.floor(input / 100) % 4 == 0) return 1;
    return 0;
  } 
  if (input % 4 == 0) return 1;
  return 0;
}

console.log(solution(input));

🔍 14681번: 사분면 고르기

클릭해서 문제 전체 보기🔼

📌 주의: 입력받을 때 fs 모듈 사용하면 런타임 에러 (EACCES) 발생

📖 풀이 코드

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

let input = [];
rl.on("line", function (line) {
  input.push(line);
}).on("close", function () {
  input = input.map((item) => +item); 
  solution(input); 
  process.exit();
}); // readline 모듈 사용

function solution(input) {
  if (+input[0] > 0) {
    if (+input[1] > 0) return console.log("1");
    return console.log("4");
  }
  if (+input[1] > 0) return console.log("2");
  return console.log("3");
}

📢 풀이 설명
위 코드의 readline 모듈입력 예제 입력이 여러 줄인 경우에 사용한다. 문제의 예제 입력 형태에 맞게 아래 작성한 코드의 부분을 바꿔주면 된다.

...(10번째줄)
  input = input.map((item) => +item); 
  solution(input);
...

예제 입력이 한 줄인 경우, 아래와 같은 코드를 사용한다.

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

rl.on('line', function(line) {
  console.log(line); // 이 부분을 문제에 맞게 수정
  rl.close();
}).on("close", function() {
  process.exit();
});

💚 추가 학습~
자바스크립트 문제의 예제를 입력받는 방법에는 fs(file system)모듈readline 모듈이 있는데, 이 둘은 콘솔의 입출력을 관리한다. node.js로 백준 문제를 풀 때 어떤 것을 사용하든 상관없다.

  • fs(file system)모듈: 특정 문제에서 런타임 에러 (EACCES) 발생 가능
  • readline 모듈: 특정 문제에서 시간 초과 발생 가능

🔍 2884번: 알람 시계

클릭해서 문제 전체 보기🔼

📖 풀이 코드

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n").join().split(" ");

let H = +input[0];
let M = +input[1] - 45;

if (M >= 0) return console.log(H, M);
if (H - 1 >= 0) return console.log(H - 1, M + 60);
return console.log(23, M + 60);

🔍 2525번: 오븐 시계

클릭해서 문제 전체 보기🔼

📖 풀이 코드

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const [ab, C] = fs.readFileSync(filePath).toString().trim().split("\n");

let AB = ab.split(" ").map((item) => +item);
let M = AB[1] + +C;
let plusH = parseInt(M / 60);
let finalM = M % 60;
let finalH = AB[0] + plusH;

if (finalH >= 24) {
  finalH -= 24;
}

console.log(finalH, finalM);

🔍 2480번: 주사위 세개

클릭해서 문제 전체 보기🔼

📖 풀이 코드

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split(" ").map((item) => +item);

if (input[0] == input[1]) {
  if (input[1] == input[2]) return console.log(10000 + input[0] * 1000);
  return console.log(1000 + input[0] * 100);
}
if (input[0] != input[1]) {
  if (input[0] == input[2] || input[1] == input[2]) return console.log(1000 + input[2] * 100);
  return console.log(Math.max(...input) * 100);
}

💚 추가 학습~
여러 원소 중 최댓값 혹은 최솟값을 구할 때 사용할 수 있는 함수는 다음과 같다.

  • Math.max() or Math.min(): 입력된 값들 중 가장 크거나 혹은 작은 값을 반환한다. 만약 배열의 형태일 경우, 원소들을 모두 풀어헤쳐 입력해야한다.

배열 속 원소들을 풀어헤치는 방법은 다음과 같다.

  • ... : 전개연산자, 배열 앞에 ...을 붙여 사용
  • Function.prototype.apply(): apply는 파라미터로 'Function에서 사용할 this객체, Function에 전달할 파라미터'를 넣어야함. 이번 문제에 적용하면 Function.prototype = Math.max, .apply(null, input)을 쓸 수 있음

참고한 자료(클릭하면 이동): else 사용 지양 이유, readline 모듈, 최댓값 혹은 최솟값 함수

profile
데브코스 프론트엔드 5기

1개의 댓글

comment-user-thumbnail
2023년 1월 10일

7문제나.. 열정적이시네요!

답글 달기

관련 채용 정보