오늘은 목걸이 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
'백준 > JavaScript' 카테고리의 다른 글
[JS] 백준 반복문 - 첫 번째 이야기 (2) | 2024.01.07 |
---|---|
[JS] 백준 조건문 - 마지막 이야기 (4) | 2024.01.06 |
[JS] 백준 조건문 - 첫 번째 이야기 (4) | 2024.01.04 |
[JS] 백준 입출력과 사칙연산 - 마지막 이야기 (4) | 2024.01.04 |
[JS] 백준 입출력과 사칙연산 - 세 번째 이야기 (0) | 2024.01.03 |