본문 바로가기

백준/JavaScript

[JS] 백준 조건문 - 두 번째 이야기

728x90

 

오늘은 목걸이 AS를 맡기고 마트에 다녀왔다 (신나) ㅎㅎ

그러나!!! 또 하루종일 밖에 있었더니 너무 피곤하다...

아무래도 운동이 필요한 것 같다(이 말 시작한지 2년째...).

 

... 좋았어~~~ 문제를 풀어볼까??

 

 

 

 

오늘의 두 번째 이야기는 ~~~~

 

문제 14681번

https://www.acmicpc.net/problem/14681

 

14681번: 사분면 고르기

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

www.acmicpc.net

 

정수 x, y가 주어지면 점 (x,y)가 어떤 사분면에 속하는지 확인하고 1,2,3,4 중 하나를 출력하면 되는 문제이다.

이 문제는 줄바꿈을 기준으로 입력을 받고 조건문으로 어떤 사분면에 해당하는지 확인하면 될 것 같다.

 

 

// 틀린코드

const fs = require('fs');

//백준에 제출할 때
const readFileSyncAdress = '/dev/stdin';

//테스트할 때
//const readFileSyncAdress = 'input.txt';

const [x,y] = fs.readFileSync(readFileSyncAdress).toString().trim().split('\n');

if(x>0){
    console.log(y>0?1:4);
} else {
    console.log(y>0?2:3);
}

...

 

... (훗... 방심했군...)

평소처럼 예제도 잘나오길래 당당하게 제출했더니... 결과는 런타임 에러(EACCES)...

 

그래서 검색해보니 이 문제는 fs(파일 시스템) 모듈을 이용할 시 에러가 발생하기 때문에 readline 모듈을 사용해야 한다고 한다.

-> 파일 시스템 모듈을 사용할 수 없을 때는 readline 모듈을 사용

 

 

 

fs만 써보니 readline을 잘 못쓰겠다...

다른 블로그보고 몇번 작성해보고 익힌 뒤 나 혼자 써본 코드이다.

 

//fs 모듈 대신에 readline 모듈 사용하는 방법

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

let input = []; //입력받은 값 저장할 배열

rl.on('line', function(line){//콘솔 입력 창에서 엔터 입력할 때마다 호출
    input.push(line);
}).on('close',function(){//콘솔 입력 창에 ctrl+c 또는 ctrl+d 입력 시 입력 종료 후 아래 코드 호출
    let x = input[0];
    let y = input[1];

    if(x>0){
        console.log(y>0?1:4);
    }else{
        console.log(y>0?2:3);
    }
    
    process.exit();
});

 

 

 

 

후... 보니까 fs로 한 코드도 찾을 수 있었다.

 

//0을 넣는 방법

 const input = require('fs').readFileSync(0).toString().split('\n');

 const [x, y] = input;

 if (x>0) {
   console.log(y>0?1:4);
 } else {
   console.log(y>0?2:3);
 }

 

 

이 문제에서는 'require('fs').readFileSync(0)'으로 사용해야 한다.

 

그 이유는 표준 파일 설명자 값이 0이기 때문이라고 한다. 별도의 파일 '/dev/stdin'이 아닌 표준 입력을 받을 경우에는 0이라는 인자값을 넘겨준다. 아마 해당 문제에서는 '/dev/stdin'경로에 파일이 없거나 권한 설정이 안 된 문제가 있는 것 같다고 한다(오호...그렇군).

 

어렵다 어려워...

생각보다 한 문제에 너무 많은 시간을 썼다.

...한 문제만 더 풀어볼까??

 

 

문제 2884번

https://www.acmicpc.net/problem/2884

 

2884번: 알람 시계

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만,

www.acmicpc.net

 

상근이가 아침에 알람을 듣고 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다고 한다(상근이는 못말려).

음음! 나도 항상 아침에는 더 자고 싶기는 하다.

 

상근이는 모든 방법을 동원해보았지만, 실패해서 그런 상근이를 불쌍하게 보던 창영이가 도와준다고 한다(좋은 친구군)

그건 바로!! "45분 일찍 알람 설정하기"이다(?난 창영이가 전화로 깨워주는 줄 알았네 ㅎㅎ).

 

좋아! 나도 상근이를 도와주기 위해 코드를 작성해봐야겠다 ㅎㅎ.

보니까 분에서 45를 빼주고 0보다 크면 그대로 출력해주고, 0보다 작으면 60을 더해준 후 시를 하나빼주면 될 것 같은데...

0시에서 23시로 넘어가는 건 어떻게 하면 되지...??

으... 머리가 안 돌아가서 다른 블로그를 찾아보았다.

 

생각했던 알고리즘이랑 비슷한 코드를 찾았다!!

이 코드가 바로 0시에서 23시로 넘어가기 위한 코드인 것 같다.

24시를 0시로 표현한 것이니까 만약 시가 -1이 되면 24시 전인 23시를 작성하면 되는 거였다 ㅎㅎ.

if(hour === -1){
      hour = 23;
}

 

그런데!!! '==='가 뭐지??

바로 찾아보았다.

== 연산자를 이용하여 서로 다른 유형의 두 변수의 [값] 비교
=== 엄격한 비교를 하는 것으로 알려져 있음([값 & 자료형] -> true)

 

이것이 무슨 소리인가... 하니

 

//숫자와 불리언 비교

만약, '0==false'를 한다면 0값이 false와 동일하므로 true가 출력된다.

그런데 '0===false'를 한다면 두 피연산자의 유형이 다르기 때문에 false가 출력된다.

 

//숫자와 문자열 비교

만약, '2=="2"'를 한다면 자동 유형변화 비교를 해 true가 출력된다.

그런데 '2==="2"'를 한다면 두 피연산자의 유형이 다르기 때문에 false가 출력된다.

 

가능한 '=='연산자를 사용하지 않도록 하고, 대신 직접 자료형을 변환하여 (casting)보다 코드 가독성을 높이도록 한다.
-> 변수를 비교하거나 어떤 비교를 위해 항상 '==='연산자를 사용할 것을 권장한다고 한다.

 

 

 

 

 

 

좋아 공부한 코드를 다시 작성해보면~~~

const fs = require('fs');

//백준에 제출할 때 써야하는 코드
const readFileSyncAdress = '/dev/stdin';

//테스트
//const readFileSyncAdress = 'input.txt';

const input = fs.readFileSync(readFileSyncAdress).toString().split(' ').map(Number);

let h = input[0];
let m = input[1];

m-=45;
if(m<0){
    m+=60;
    h--;
    if(h===-1){
        h=23;
    }
}

console.log(h+' '+m);

 

 

상근아, 어떠니...? 이제 잘 일어날 수 있겠지?? ㅎㅎ

 

 

그럼 모두들 굿나잇~~

 

 

[참고]
https://gurtn.tistory.com/17
https://velog.io/@dbqls6365/%EB%B0%B1%EC%A4%80BOJ-14681%EB%B2%88-%EC%82%AC%EB%B6%84%EB%A9%B4-%EA%B3%A0%EB%A5%B4%EA%B8%B0

https://gurtn.tistory.com/20
https://velog.io/@filoscoder/-%EC%99%80-%EC%9D%98-%EC%B0%A8%EC%9D%B4-oak1091tes

 

728x90