34일차 - 2022.04.03

안병욱·2022년 4월 3일
0

오늘 공부한 내용 요약

Baekjoon에서 문제풀이

1) 문제 : 연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오. 윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.
(연도는 1보다 크거나 같고, 4000보다 작거나 같은 자연수이다)


어제 풀었던 문제의 다른 풀이
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split(' ');

let a = Math.floor(parseInt(input[0]));

if (a>=1 && a <=4000) {
    if ((a % 4==0)&&(a % 100 !=0)) {
     console.log(1);   
    } else if((a % 4==0)&&(a % 400==0)){
        console.log(1);
    } else {
     console.log(0);
    }
}

2) 문제 :
문제예시
(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.
첫째 줄에 (1)의 위치에 들어갈 세 자리 자연수가, 둘째 줄에 (2)의 위치에 들어갈 세자리 자연수가 주어진다. 첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.


고민과정 (1)과 (2)에 들어갈게 자연수이기에 Math.floor이용해서 소수점 없애고 / (4),(5)에는 10,100을 곱해준후 (3)까지 3개를 더해서 (6)을 구하고 / (1),(2)가 세자리 수이므로 100~999 범위 정해주고 / 결과값을 한줄이 아닌 네개의 줄에 나눠서 출력 \n이용 / (2)의 각각의 값들을 어떻게 (1)에 곱해줄지 고민

풀이
1.

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n');

let A = Math.floor(parseInt(input[0]));
let B = Math.floor(parseInt(input[1]));

let a = A * (B%10);
let b = A * ((B%100)-(B%10)) /10 ;
let c = A * Math.floor(B/100);    
let d = A * B;

if (A>=100 && A<=999 && B>=100 && B<=999) {
    console.log(`${a}\n${b}\n${c}\n${d}`);
}
let A = Math.floor(parseInt(input[0]));
let B = Math.floor(parseInt(input[1]));

let a = A * (B%10);
let b = A * Math.floor((B%100) /10) ;
let c = A * Math.floor(B/100);    
let d = a + 10*b + 100*c ;

if (A>=100 && A<=999 && B>=100 && B<=999) {
    console.log(`${a}\n${b}\n${c}\n${d}`);
}

b,d의 내용을 위와 같이 변화해도 가능


정리 : 맞게 작성한거 같은데 오답이라 한참을 들여다보다 문제에 입력값을 한줄이 아닌 2줄에 입력하는 것을 확인.
fs모듈 사용법을 찾아보다 공백으로 구분된 한줄의 값을 입력시 split(' ')
여러줄의 값을 입력시 split('\n')인 것이 기억나서 split('\n')을 적용하니 정답.

string = "   a     b   c d";
split()같이 매개변수가 없으면 string.split = ['a','b','c','d']
string.split(' ') = ['','a','','','b','','c','d'] 공백 적용


3) 문제 :

예를 들어, 좌표가 (12, 5)인 점 A는 x좌표와 y좌표가 모두 양수이므로 제1사분면에 속한다. 점 B는 x좌표가 음수이고 y좌표가 양수이므로 제2사분면에 속한다. 점의 좌표를 입력받아 그 점이 어느 사분면에 속하는지 알아내는 프로그램을 작성하시오. 단, x좌표와 y좌표는 모두 양수나 음수라고 가정한다. 첫 줄에는 정수 x가 주어진다. (−1000 ≤ x ≤ 1000; x ≠ 0) 다음 줄에는 정수 y가 주어진다. (−1000 ≤ y ≤ 1000; y ≠ 0)

점 (x, y)의 사분면 번호(1, 2, 3, 4 중 하나)를 출력한다.


고민과정

두줄에 입력해야하므로 split('\n')을 이용하고 / x,y는 정수 / x,y의 범위는 if조건문에 넣고

const fs = require('fs');
const input = fs.readFileSync("/dev/stdin").toString().trim().split('\n');

let x = Math.floor(parseInt(input[0]));
let y = Math.floor(parseInt(input[1]));

if (x>=-1000 && x<=1000 && x!=0 && y>=-1000 && y<=1000 && y!=0) {
    if (x > 0 && y > 0){
        console.log(1);
    } else if (x<0 && y>0) {
        console.log(2);
    } else if (x<0 && y<0) {
        console.log(3);
    } else if (x>0 && y<0) {
        console.log(4);
    }
}

로 작성했으나 처음보는 eacces에러 발생. 어떤 에러인가 검색해보니 접근권한 오류라고 함. 해당 문제가 예시로 적혀있었는데 fs모듈이 아닌 readline모듈로 풀어야 하는것 확인.
fs모듈 방법을 다 이해한건 아니지만 readline모듈방법도 정확하게 이해가 가진 않는데 우선 기본 사용법과 문법으로 적용해 풀이후 내일 좀더 세세하게 학습예정.


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

let input = [];

rl.on("line",function(line) {
    input.push(parseInt(line));
}).on("close", function () {
    
    const x = Math.floor(parseInt(input[0]));
    const y = Math.floor(parseInt(input[1]));
    
    if (x>=-1000 && x<=1000 && x!=0 && y>=-1000 && y<=1000 && y!=0) {
    if (x > 0 && y > 0){
        console.log(1);
    } else if (x<0 && y>0) {
        console.log(2);
    } else if (x<0 && y<0) {
        console.log(3);
    } else if (x>0 && y<0) {
        console.log(4);
    }
}
    process.exit();
});    

  1. readlinea모듈 + ?이용 시도
if (x>=-1000 && x<=1000 && x!=0 && y>=-1000 && y<=1000 && y!=0) {
    if (x > 0) {
        y > 0 ? console.log(1) : console.log(4);
    } else if (x<0) {
        y < 0 ? console.log(3) : console.log(2);
    }
}

if문에 ?을 이용해 위와 같이 해도 가능


  1. fs모듈 이용
    당장에 이해가 가는 방법은 아니지만 readline모듈 방법을 찾다 fs모듈로 가능한 방법을 우연히 발견해버려서 우선 기재함
fs.readFileSync("/dev/stdin").toString().trim().split('\n');

여기서 readFileSync를 

fs.readFileSync(0).toString().trim().split('\n');
으로 적용시 fs모듈로도 정답이 나옴을 확인

경로를 0으로 하는것으로 왜 fs모듈을 사용할 수 있게 되었는지 이해는 불가
추후 돌아와서 학습예정


4) 문제 : 현재 상근이가 설정한 알람 시각이 주어졌을 때, 알람을 45분 앞서는 시간으로 변환하는 프로그램을 작성하시오.
첫째 줄에 두 정수 H와 M이 주어진다. (0 ≤ H ≤ 23, 0 ≤ M ≤ 59) 그리고 이것은 현재 상근이가 설정한 놓은 알람 시간 H시 M분을 의미한다. 입력 시간은 24시간 표현을 사용한다. 24시간 표현에서 하루의 시작은 0:0(자정)이고, 끝은 23:59(다음날 자정 1분 전)이다. 시간을 나타낼 때, 불필요한 0은 사용하지 않는다.

고민과정
M분에 45를 뺐을 때 0보다 크면 그대로 가고 0보다 작으면 H를 1빼는 식으로 하면 될듯함

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split(' ');

let H = Math.floor(parseInt(input[0]));
let M = Math.floor(parseInt(input[1]));

if (H>=0 && H<=23 && M>=0 && M<=59) {
    if (M-45 >=0 ){
        console.log(`${H}:${M-45}`);
    } else if (H>=1 && M-45 <0 ){
        console.log(`${H-1}:${M+15}`);   
    } else if (H==0 && M-45 <0){
        console.log(`23:${M+15}`);
    }
}

으로 시도했으나 오답. -=을 이용한 방법도 있을거 같은데 우선 이 방법으로 하려했으나 왜 안되는지 고민하다 예제의 출력을 보고 :이 아닌 공백으로 구성된거 발견...


풀이
1.

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().trim().split(' ');

let H = Math.floor(parseInt(input[0]));
let M = Math.floor(parseInt(input[1]));


    if (M-45 >=0 ){
        console.log(`${H}` + " " + `${M-45}`);
    } else if (H>=1){
        console.log(`${H-1}` + " " + `${M+15}`);   
    } else {
        console.log(23 + " " + `${M+15}`);
    }

내일 학습예정

  • baekjoon 조건문 마무리 및 풀었던 문제 다른풀이법 고민
  • readline모듈 원리 및 기본 이해

하루 돌아보며

  • node.js의 학습이 당장 목표가 아니라고 생각해 보다 자세하게 결과, 원리, 원인등을 찾아보다 이해가 당장 쉽지않아 우선 적용만 하며 문제들의 풀이방식 고민에 좀더 중점을 두고 학습중이고 앞으로도 그럴 예정인데
    이러한 학습방식이 좋은 방식이 아니라면 초보를 위해 댓글 달아주시면 감사하겠습니다.

만족도 : ★★☆☆☆

공부 출처

BaekJoon


위의 내용은 공부중 본인이 이해한 내용으로 몇몇 틀린 내용이 있을 수 있습니다.
회독중 발견시 수정하겠습니다

profile
working hard

0개의 댓글