티스토리 뷰
1. 두 수 비교하기
문제
두 수 비교하기
문제
두 정수 A와 B가 주어졌을 때, A와 B를 비교하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. A와 B는 공백 한 칸으로 구분되어져 있다.
출력
첫째 줄에 다음 세 가지 중 하나를 출력한다.
A가 B보다 큰 경우에는 '>'를 출력한다.
A가 B보다 작은 경우에는 '<'를 출력한다.
A와 B가 같은 경우에는 '=='를 출력한다.
제한
-10,000 ≤ A, B ≤ 10,000
예제 입력 1
1 2
예제 출력 1
<
예제 입력 2
10 2
예제 출력 2
>
예제 입력 3
5 5
예제 출력 3
==
해답
const fs = require("fs");
const inputData = fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString()
.split(" ")
.map((value) => +value);
const [a, b] = inputData;
function compare(a, b) {
if (a > b) {
return ">";
} else if (a < b) {
return "<";
} else if (a == b) {
return "==";
}
}
console.log(compare(a, b));
풀이
inputData
readFileSync()
const fs = require("fs");
const inputData = fs.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);
console.log(inputData); // <Buffer 31 20 32>
백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()
를 이용하는 것입니다.
process.platform
백준의 파일 경로는 "/dev/stdin"
입니다.
process.platform
이 "linux"
인 경우 경로를 "/dev/stdin"
으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.
toString()
const inputData = fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString();
console.log(inputData); // 1 2
Buffer 형식으로 출력된 값을 toString()
을 통해 기본값인 "utf8"
형식으로 출력합니다.
split()
const inputData = fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString()
.split(" ");
console.log(inputData); // [ '1', '2' ]
split()
를 활용하여 매개변수에 공백을 의미하는 " "
를 넣어 배열을 만듭니다.
map()
const inputData = fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString()
.split(" ")
.map((value) => +value);
console.log(inputData); // [ 1, 2 ]
map()
메서드의 callback 함수를 활용하여 string
형식이었던 배열의 각 값을 number
형식으로 바꿉니다.
배열 구조 분해
const [a, b] = inputData;
console.log(a); // 1
console.log(b); // 2
구조 분해 할당의 배열 구조 분해을 통해 배열 속의 a
, b
에 값을 할당합니다.
compare()
function compare(a, b) {
if (a > b) {
return ">";
} else if (a < b) {
return "<";
} else if (a == b) {
return "==";
}
}
if...else
매개변수 a
,b
를 받는 함수 compare()
을 생성하여 if...else를 활용하여
a
가 b
보다 큰 경우 ">"
을,a
가 b
보다 작은 경우 "<"
을,a
와 b
가 같은 경우 "=="
을
return
명령문을 통해 반환하게 합니다.
console.log()
console.log(compare(a, b)); // <
1
과 2
를 대입하였을 경우 <
가 출력되고,10
, 2
를 대입하였을 경우 >
가 출력되고,5
, 5
를 대입하였을 경우 ==
가 출력되는 것을 알 수 있습니다.
2. 시험 성적
문제
시험 성적
문제
시험 점수를 입력받아 90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 시험 점수가 주어진다. 시험 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
출력
시험 성적을 출력한다.
예제 입력 1
100
예제 출력 1
A
해답
const fs = require("fs");
const inputData = +fs.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);
function grade(score) {
if (score >= 90 && score <= 100) {
return "A";
} else if (score >= 80 && score < 90) {
return "B";
} else if (score >= 70 && score < 80) {
return "C";
} else if (score >= 60 && score < 70) {
return "D";
} else {
return "F";
}
}
console.log(grade(inputData));
풀이
inputData
readFileSync()
const fs = require("fs");
const inputData = fs.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);
console.log(inputData); // <Buffer 31 30 30>
백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()
를 이용하는 것입니다.
process.platform
백준의 파일 경로는 "/dev/stdin"
입니다.
process.platform
이 "linux"
인 경우 경로를 "/dev/stdin"
으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.
+
const inputData = +fs.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);
console.log(inputData); // 100
Buffer 형식으로 출력된 값을 inputData
로 정의하려는 식 앞에 +
를 붙여 실수 형식으로 변환합니다.
grade()
function grade(score) {
if (score >= 90 && score <= 100) {
return "A";
} else if (score >= 80 && score < 90) {
return "B";
} else if (score >= 70 && score < 80) {
return "C";
} else if (score >= 60 && score < 70) {
return "D";
} else {
return "F";
}
}
if...else
매개변수 score
를 받는 함수 grade()
를 생성하여 if...else를 활용하여
score가 90이상 100 이하이면 "A"
를,
80이상 90 미만이면 "B"
를,
70이상 80 미만이면 "C"
를,
60이상 70 미만이면 "D"
를,
위의 조건을 충족하지 못하는 나머지의 경우 "F"
를
return
명령문을 통해 반환하게 합니다.
console.log()
console.log(grade(inputData)); // A
console.log
메서드를 통해 A
가 정상적으로 출력되는 것을 알 수 있습니다.
3. 윤년
문제
윤년
문제
연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오.
윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.
예를 들어, 2012년은 4의 배수이면서 100의 배수가 아니라서 윤년이다. 1900년은 100의 배수이고 400의 배수는 아니기 때문에 윤년이 아니다. 하지만, 2000년은 400의 배수이기 때문에 윤년이다.
입력
첫째 줄에 연도가 주어진다. 연도는 1보다 크거나 같고, 4000보다 작거나 같은 자연수이다.
출력
첫째 줄에 윤년이면 1, 아니면 0을 출력한다.
예제 입력 1
2000
예제 출력 1
1
예제 입력 2
1999
예제 출력 2
0
해답
const fs = require("fs");
const inputData = +fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString();
(inputData % 4 === 0 && inputData % 100 !== 0) ||
(inputData % 4 === 0 && inputData % 400 === 0)
? console.log(1)
: console.log(0);
풀이
inputData
readFileSync()
const fs = require("fs");
const inputData = fs.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);
console.log(inputData); // <Buffer 32 30 30 30>
백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()
를 이용하는 것입니다.
process.platform
백준의 파일 경로는 "/dev/stdin"
입니다.
process.platform
이 "linux"
인 경우 경로를 "/dev/stdin"
으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.
+
const inputData = +fs.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);
console.log(inputData); // 2000
Buffer 형식으로 출력된 값을 inputData
로 정의하려는 식 앞에 +
를 붙여 실수 형식으로 변환합니다.
윤년
삼항연산자
if...else문으로 할 수 있지만 간단하게 표현하기 위해 삼항연산자를 활용해보았습니다.
(inputData % 4 === 0 && inputData % 100 !== 0) ||
(inputData % 4 === 0 && inputData % 400 === 0);
윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.
4의 배수이면서 100의 배수가 아닐 때이거나 4의 배수이면서 400의 배수일 때를 비교연산자와 논리연산자와 산술연산자를 활용하여 조건에 맞게 구현합니다.
console.log()
(inputData % 4 === 0 && inputData % 100 !== 0) ||
(inputData % 4 === 0 && inputData % 400 === 0)
? console.log(1)
: console.log(0); // 1
console.log
메서드를 통해 2000년은 윤년이므로 1
이 정상적으로 출력되는 것을 알 수 있습니다.
4. 사분면 고르기
문제
사분면 고르기
문제
흔한 수학 문제 중 하나는 주어진 점이 어느 사분면에 속하는지 알아내는 것이다. 사분면은 아래 그림처럼 1부터 4까지 번호를 갖는다. "Quadrant n"은 "제n사분면"이라는 뜻이다.
예를 들어, 좌표가 (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 중 하나)를 출력한다.
예제 입력 1
12
5
예제 출력 1
1
예제 입력 2
9
-13
예제 출력 2
4
해답
const fs = require("fs");
const inputData = fs
.readFileSync(process.platform === "linux" ? 0 : "../../../../index.txt")
.toString()
.split("\n")
.map((value) => +value);
const [a, b] = inputData;
function quadrant(a, b) {
if (a > 0 && b > 0) {
return 1;
} else if (a < 0 && b > 0) {
return 2;
} else if (a < 0 && b < 0) {
return 3;
} else if (a > 0 && b < 0) {
return 4;
}
}
console.log(quadrant(a, b));
풀이
inputData
readFileSync()
const fs = require("fs");
const inputData = fs.readFileSync(
process.platform === "linux" ? 0 : "../../../../index.txt"
);
console.log(inputData); // <Buffer 31 32 0a 35>
백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()
를 이용하는 것입니다.
process.platform
백준의 파일 경로는 "/dev/stdin"
입니다. 하지만 이 문제에서만큼은 이유를 잘 모르겠지만 백준에서 런타임 에러가 납니다. 다른 분들이 하신 것을 참고해보니, "/dev/stdin"
대신에 0
을 넣었더니 문제가 풀렸습니다.
process.platform
이 "linux"
인 경우 경로를 0
으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.
toString()
const inputData = fs
.readFileSync(process.platform === "linux" ? 0 : "../../../../index.txt")
.toString();
console.log(inputData);
// 12
// 5
Buffer 형식으로 출력된 값을 toString()
을 통해 기본값인 "utf8"
형식으로 출력합니다.
split()
const inputData = fs
.readFileSync(process.platform === "linux" ? 0 : "../../../../index.txt")
.toString()
.split("\n");
console.log(inputData); // [ '12', '5' ]
split()
를 활용하여 매개변수에 다음줄을 의미하는 "\n"
를 넣어 배열을 만듭니다.
map()
const inputData = fs
.readFileSync(process.platform === "linux" ? 0 : "../../../../index.txt")
.toString()
.split(" ")
.map((value) => +value);
console.log(inputData); // [ 12, 5 ]
map()
메서드의 callback 함수를 활용하여 string
형식이었던 배열의 각 값을 number
형식으로 바꿉니다.
배열 구조 분해
const [a, b] = inputData;
console.log(a); // 12
console.log(b); // 5
구조 분해 할당의 배열 구조 분해을 통해 배열 속의 a
, b
에 값을 할당합니다.
quadrant(a,b)
function quadrant(a, b) {
if (a > 0 && b > 0) {
return 1;
} else if (a < 0 && b > 0) {
return 2;
} else if (a < 0 && b < 0) {
return 3;
} else if (a > 0 && b < 0) {
return 4;
}
}
사분면을 구별할 수 있는 매개변수 a
, b
를 요구하는 quadrant()
함수를 만듭니다.
if...else
if...else문과 비교연산자와 논리연산자을 활용하여
return
a
, b
가 모두 양수일 경우 1사분면을 의미하는 1
을 반환하고,a
는 음수이고, b
는 양수일 2사분면을 의미하는 경우 2
를 반환하고,a
, b
가 모두 음수일 경우 3사분면을 의미하는 3
을 반환하고,a
는 양수이고, b
는 음수일 경우 4사분면을 의미하는 4
를 반환하게 합니다.
console.log()
console.log(quadrant(a, b)); // 1
console.log() 메서드를 통해 quadrant(a,b)
를 출력하면 12, 5
인 경우 1
이 출력되고 9, -13
일 경우 4
가 출력되는 것을 알 수 있습니다.
5. 알람 시계
문제
알람 시계
문제
상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다.
상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다.
이런 상근이를 불쌍하게 보던, 창영이는 자신이 사용하는 방법을 추천해 주었다.
바로 "45분 일찍 알람 설정하기"이다.
이 방법은 단순하다. 원래 설정되어 있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피 알람 소리를 들으면, 알람을 끄고 조금 더 잘 것이기 때문이다. 이 방법을 사용하면, 매일 아침 더 잤다는 기분을 느낄 수 있고, 학교도 지각하지 않게 된다.
현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 두 정수 H와 M이 주어진다. (0 ≤ H ≤ 23, 0 ≤ M ≤ 59) 그리고 이것은 현재 상근이가 설정한 놓은 알람 시간 H시 M분을 의미한다.
입력 시간은 24시간 표현을 사용한다. 24시간 표현에서 하루의 시작은 0:0(자정)이고, 끝은 23:59(다음날 자정 1분 전)이다. 시간을 나타낼 때, 불필요한 0은 사용하지 않는다.
출력
첫째 줄에 상근이가 창영이의 방법을 사용할 때, 설정해야 하는 알람 시간을 출력한다. (입력과 같은 형태로 출력하면 된다.)
예제 입력 1
10 10
예제 출력 1
9 25
예제 입력 2
0 30
예제 출력 2
23 45
예제 입력 3
23 40
예제 출력 3
22 55
해답
const fs = require("fs");
const inputData = fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString()
.split(" ")
.map((value) => +value);
const [hour, minute] = inputData;
function alarm(hour, minute) {
minute -= 45;
if (minute < 0) {
minute += 60;
hour -= 1;
if (hour < 0) {
hour = 23;
}
}
return [hour, minute];
}
const [newHour, newMinute] = alarm(hour, minute);
console.log(newHour, newMinute);
풀이
inputData
readFileSync()
const fs = require("fs");
const inputData = fs.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);
console.log(inputData); // <Buffer 30 20 33 30>
백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()
를 이용하는 것입니다.
process.platform
process.platform
이 "linux"
인 경우 경로를 "/dev/stdin"
으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.
toString()
const inputData = fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString();
console.log(inputData); // 0 30
Buffer 형식으로 출력된 값을 toString()
을 통해 기본값인 "utf8"
형식으로 출력합니다.
split()
const inputData = fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString()
.split(" ");
console.log(inputData); // [ '0', '30' ]
split()
를 활용하여 매개변수에 공백을 의미하는 " "
를 넣어 배열을 만듭니다.
map()
const inputData = fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString()
.split(" ")
.map((value) => +value);
console.log(inputData); // [ 0, 30 ]
map()
메서드의 callback 함수를 활용하여 string
형식이었던 배열의 각 값을 number
형식으로 바꿉니다.
배열 구조 분해
const [hours, minutes] = inputData;
console.log(a); // 0
console.log(b); // 30
구조 분해 할당의 배열 구조 분해을 통해 배열 속의 a
, b
에 값을 할당합니다.
alarm()
function alarm(hour, minute) {
minute -= 45;
if (minute < 0) {
minute += 60;
hour -= 1;
if (hour < 0) {
hour = 23;
}
}
return [hour, minute];
}
사분면을 구별할 수 있는 매개변수 a
, b
를 요구하는 alarm()
함수를 만듭니다.
if...else
function alarm(hour, minute) {
minute -= 45; // expected output: 0 -15
}
45분 일찍 알람 설정하기로 인해 minute -= 45
의 과정을 거치면 결과는 0 -15
가 됩니다.
function alarm(hour, minute) {
minute -= 45;
if (minute < 0) {
minute += 60; // expected output: 0 45
hour -= 1; // expected output: -1 45
}
}
음수인 분단위는 존재하지가 않으므로 0 -15
에서 minute += 60
을 해줍니다. 결과값은 0 45
이 되고,
60분을 시간에서 빼서 더하였기 때문에 시간을 1만큼 빼줘 hour -= 1
를 거쳐 -1 45
가 되게 합니다.
function alarm(hour, minute) {
minute -= 45;
if (minute < 0) {
minute += 60;
hour -= 1;
if (hour < 0) {
hour = 23; // expected output: 23 45
}
}
}
시간에서 0은 자정을 의미하기 때문에 만약 시간을 의미하는 매개변수 hour
이 0
보다 작으면 hour
은 23
이라고 설정해줍니다.
return
function alarm(hour, minute) {
minute -= 45;
if (minute < 0) {
minute += 60;
hour -= 1;
if (hour < 0) {
hour = 23;
}
}
return [hour, minute];
}
if...else문을 통해서 계산된 hour
과 minute
를 return 명령문을 통해 배열로 반환해줍니다.
배열 구조 분해
const [newHour, nweMinute] = alarm(hour, minute);
console.log(newHour); // 23
console.log(newMinute); // 45
구조 분해 할당의 배열 구조 분해을 통해 alarm(hour, minute)
을 통해 반환된 배열 [hour, minute]
로부터 newHour
, newMinute
에 값을 할당합니다.
console.log()
console.log(newHour, newMinute); // 23 45
console.log() 메서드를 통해 newHour
, newMinute
을 출력하면 10 10
인 경우 9 25
가 출력되고 0, 30
일 경우 23 45
가 출력되고 23 40
은 22 55
가 출력되는 것을 알 수 있습니다.
6. 오븐 시계
문제
오븐 시계
문제
KOI 전자에서는 건강에 좋고 맛있는 훈제오리구이 요리를 간편하게 만드는 인공지능 오븐을 개발하려고 한다. 인공지능 오븐을 사용하는 방법은 적당한 양의 오리 훈제 재료를 인공지능 오븐에 넣으면 된다. 그러면 인공지능 오븐은 오븐구이가 끝나는 시간을 분 단위로 자동적으로 계산한다.
또한, KOI 전자의 인공지능 오븐 앞면에는 사용자에게 훈제오리구이 요리가 끝나는 시각을 알려 주는 디지털 시계가 있다.
훈제오리구이를 시작하는 시각과 오븐구이를 하는 데 필요한 시간이 분단위로 주어졌을 때, 오븐구이가 끝나는 시각을 계산하는 프로그램을 작성하시오.
입력
첫째 줄에는 현재 시각이 나온다. 현재 시각은 시 A (0 ≤ A ≤ 23) 와 분 B (0 ≤ B ≤ 59)가 정수로 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 요리하는 데 필요한 시간 C (0 ≤ C ≤ 1,000)가 분 단위로 주어진다.
출력
첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.)
예제 입력 1
14 30
20
예제 출력 1
14 50
예제 입력 2
17 40
80
예제 출력 2
19 0
예제 입력 3
23 48
25
예제 출력 3
0 13
해답
const fs = require("fs");
const inputData = fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString()
.split("\n");
const [timeData, plusMinuteData] = inputData;
const plusMinute = +plusMinuteData;
const time = timeData.split(" ").map((value) => +value);
const [hour, minute] = time;
function ovenClock(hour, minute, plusMinute) {
minute += plusMinute;
while (minute >= 60) {
minute -= 60;
hour += 1;
}
if (hour >= 24) {
hour -= 24;
}
return [hour, minute];
}
[resultHour, resultMinute] = ovenClock(hour, minute, plusMinute);
console.log(resultHour, resultMinute);
풀이
inputData
파일 부르기
readFileSync()
const fs = require("fs");
const inputData = fs.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);
console.log(inputData); // <Buffer 31 37 20 34 30 0a 38 30>
백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()
를 이용하는 것입니다.
작동 시스템 구별
process.platform
process.platform
이 "linux"
인 경우 경로를 "/dev/stdin"
으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.
문자열 형식으로 변환
toString()
const inputData = fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString();
console.log(inputData);
// 17 40
// 80
Buffer 형식으로 출력된 값을 toString()
을 통해 기본값인 "utf8"
형식으로 출력합니다.
배열 생성
split()
const inputData = fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString()
.split("\n");
console.log(inputData); // [ '17 40', '80' ]
split()
를 활용하여 매개변수에 다음줄을 의미하는 "\n"
를 넣어 배열을 만듭니다.
배열 구조 분해
const [timeData, plusMinuteData] = inputData;
console.log(timeData, plusMinuteData); // 17 40 80
구조 분해 할당의 배열 구조 분해을 통해 inputData
를 배열 속의 현재 시간을 의미하는 timeData
, 추가되는 시간을 의미하는 plusMinuteData
에 값을 할당합니다.
plusMinute
문자열을 실수로 변한
+
const plusMinute = +plusMinuteData;
console.log(plusMinute); // 80
문자열 형식인 추가되는 시간을 의미하는 plusMinuteData
를 연산을 하기 위해 실수 형태로 변환시켜줍니다.
time
const time = timeData.split(" ").map((value) => +value);
const [hour, minute] = time;
배열 생성
split()
const time = timeData.split(" ");
console.log(time); // [ '17', '40' ]
현재 시간을 의미하는 timeData
에서 split()
메서드를 활용하여 공백을 의미하는 " "
을 매개변수로 하여 배열을 생성합니다.
문자열 배열에서 실수 배열로 변환
map()
const time = timeData.split(" ").map((value) => +value);
console.log(time); // [ 17, 40 ]
map()
메서드의 callback 함수를 활용하여 string
형식이었던 배열의 각 값을 number
형식으로 바꿉니다.
배열 구조 분해
const [hour, minute] = time;
console.log(hour, minute); // 17 40
구조 분해 할당의 배열 구조 분해을 통해 time
을 배열 속의 현재 시간의 시
를 의미하는 hour
, 현재 시간을 분
의미하는 minute
에 값을 할당합니다.
ovenClock()
function ovenClock(hour, minute, plusMinute) {
minute += plusMinute;
while (minute >= 60) {
minute -= 60;
hour += 1;
}
if (hour >= 24) {
hour -= 24;
}
return [hour, minute];
}
오븐 시간을 계산하며 매개변수 hour
, minute
, plusMinute
을 요구하는 ovenClock()
함수를 만듭니다.
if...else문과, while문과 할당연산자를 활용하여
현재 시간에 추가할 시간 더하기
+=
function ovenClock(hour, minute, plusMinute) {
minute += plusMinute; // expected output: 17 120
}
우선 현재 시간에서 추가할 시간을 더해야 하므로 minute += plusMinute
의 과정을 거치면 결과는 17 120
이 됩니다.
60분을 초과한 경우
while
function ovenClock(hour, minute, plusMinute) {
minute += plusMinute;
while (minute >= 60) {
minute -= 60; // expected output: 60 => 0
hour += 1; // expected output: 18 => 19
}
}
17 120
에서 while
문을 만나 조건인 minute >= 60
에 만족하지 않을 때까지 minute -= 60
과 hour += 1
을 수행합니다.
첫번째 사이클의 결과는 18 60
입니다. 조건 minute >= 60
에 만족하므로 한 번 더 진행합니다.
두번째 사이클의 결과는 19 0
입니다. 조건 minute >= 60
에 만족하지 않으므로 while
문을 빠져나옵니다.
24시를 초과한 경우
if...else
function ovenClock(hour, minute, plusMinute) {
minute += plusMinute;
while (minute >= 60) {
minute -= 60;
hour += 1;
}
if (hour >= 24) {
hour -= 24; // expected output: 19
}
}
만약 시가 24를 초과하여 25, 26과 같이 될 경우를 대비하여
hour >= 24
조건을 만족시킨다면 hour -= 24
를 통해 24시간을 빼줍니다.
return
function ovenClock(hour, minute, plusMinute) {
minute += plusMinute;
while (minute >= 60) {
minute -= 60;
hour += 1;
}
if (hour >= 24) {
hour -= 24;
}
return [hour, minute];
}
위의 과정들을 통해 계산된 hour
과 minute
를 return 명령문을 통해 배열로 반환해줍니다.
배열 구조 분해
[resultHour, resultMinute] = ovenClock(hour, minute, plusMinute);
console.log(resultHour); // 19
console.log(resultMinute); // 0
구조 분해 할당의 배열 구조 분해을 통해 ovenClock(hour, minute, plusMinute)
을 통해 반환된 배열 [hour, minute]
로부터 resultHour
, resultMinute
에 값을 할당합니다.
결과 출력
console.log()
console.log(resultHour, resultMinute); // 19 0
console.log() 메서드를 통해 resultHour
, resultMinute
을 출력하면 14 30
그리고 20
인 경우 14 50
이 출력되고 17 40
그리고 80
인 경우 19 0
이 출력되고 23 48
그리고 25
인 경우 0 13
이 출력되는 것을 알 수 있습니다.
7. 주사위 세개
문제
주사위 세개
문제
1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.
같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.
3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.
입력
첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다.
출력
첫째 줄에 게임의 상금을 출력 한다.
예제 입력 1
3 3 6
예제 출력 1
1300
예제 입력 2
2 2 2
예제 출력 2
12000
예제 입력 3
6 2 5
예제 출력 3
600
해답
const fs = require("fs");
const inputdata = fs
.readfilesync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString()
.split(" ")
.map((value) => +value);
const [a, b, c] = inputData;
function threeDice(first, second, third) {
function twoSameDice(first, second, third) {
if (first === second && first !== third) {
return first;
} else if (first === third && first !== second) {
return first;
} else if (second === third && second !== first) {
return second;
}
}
function theBiggestDice(first, second, third) {
if (
(first > second && second > third) ||
(first > third && third > second)
) {
return first;
} else if (
(second > first && first > third) ||
(second > third && third > first)
) {
return second;
} else if (
(third > first && first > second) ||
(third > second && second > first)
) {
return third;
}
}
if (first === second && first === third && second === third) {
return 10000 + first * 1000;
} else if (first === second || first === third || second === third) {
return 1000 + twoSameDice(first, second, third) * 100;
} else if (first !== second && first !== third && second !== third) {
return theBiggestDice(first, second, third) * 100;
}
}
console.log(threeDice(a, b, c));
풀이
inputData
파일 읽어오기
readFileSync()
const fs = require("fs");
const inputData = fs.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);
console.log(inputData); // <Buffer 36 20 32 20 35>
백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()
를 이용하는 것입니다.
작동 시스템 구별
process.platform
process.platform
이 "linux"
인 경우 경로를 "/dev/stdin"
으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.
문자열 형식으로 변환
toString()
const inputData = fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString();
console.log(inputData); // 6 2 5
Buffer 형식으로 출력된 값을 toString()
을 통해 기본값인 "utf8"
형식으로 출력합니다.
배열 생성
split()
first
const inputData = fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString()
.split(" ");
console.log(inputData); // [ '6', '2`, '5' ]
split()
를 활용하여 매개변수에 공백을 의미하는 " "
를 넣어 배열을 만듭니다.
문자열 배열에서 실수 배열로 변환
map()
const inputData = fs
.readFileSync(
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
)
.toString()
.split(" ")
.map((value) => +value);
console.log(inputData); // [ 6, 2, 5 ]
map()
메서드의 callback 함수를 활용하여 string
형식이었던 배열의 각 값을 number
형식으로 바꿉니다.
배열 구조 분해
const [a, b, c] = inputData;
console.log(a, b, c); // 6 2 5
구조 분해 할당의 배열 구조 분해을 통해 inputData
를 각각 세 숫자를 의미하는 a
, b
, c
에 할당합니다.
threeDice()
function threeDice(first, second, third) {
function twoSameDice(first, second, third) {
if (first === second && first !== third) {
return first;
} else if (first === third && first !== second) {
return first;
} else if (second === third && second !== first) {
return second;
}
}
function theBiggestDice(first, second, third) {
if (
(first > second && second > third) ||
(first > third && third > second)
) {
return first;
} else if (
(second > first && first > third) ||
(second > third && third > first)
) {
return second;
} else if (
(third > first && first > second) ||
(third > second && second > first)
) {
return third;
}
}
if (first === second && first === third && second === third) {
return 10000 + first * 1000;
} else if (first === second || first === third || second === third) {
return 1000 + twoSameDice(first, second, third) * 100;
} else if (first !== second && first !== third && second !== third) {
return theBiggestDice(first, second, third) * 100;
}
}
- 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
- 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
- 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
세 주사위를 의미하는 매개변수 first
, second
, third
를 요구하는 threeDice()
함수를 만듭니다.
그리고 매개변수 first
, second
, third
를 요구하며 같은 눈이 2개만 나오는 경우를 위해 두 눈만 같은 주사위일때 그 눈의 값을 얻는 함수와, 모두 다른 눈이 나오는 경우일 때 제일 큰 눈의 주사위 값을 얻는 함수를 만듭니다.
두 눈만 같은 주사위 값 구하기
twoSameDice()
function twoSameDice(first, second, third) {
if (first === second && first !== third) {
return first;
} else if (first === third && first !== second) {
return first;
} else if (second === third && second !== first) {
return second;
}
}
두 눈만 같은 주사위 값을 얻어야하므로 if...else문과 return 명령문을 활용하여
1번 다이스와 2번 다이스와 같은 수이면서, 1번 다이스는 3번 다이스와 다른 수이면 1번 다이스 반환
같은 다이스이기 떄문에 1번과 2번, 둘 중에 뭘 반환하든 상관이 없다.
1번 다이스와 3번 다이스와 같은 수이면서, 1번 다이스는 2번 다이스와 다른 수이면 1번 다이스 반환
2번 다이스와 3번 다이스와 같은 수이면서, 2번 다이스는 1번 다이스와 다른 수이면 2번 다이스 반환
위 세 가지 조건을 가지는 함수를 만듭니다.
제일 큰 수의 주사위 값 구하기
theBiggestDice()
function theBiggestDice(first, second, third) {
if ((first > second && second > third) || (first > third && third > second)) {
return first;
} else if (
(second > first && first > third) ||
(second > third && third > first)
) {
return second;
} else if (
(third > first && first > second) ||
(third > second && second > first)
) {
return third;
}
}
제일 큰 수의 주사위 값을 얻어야 하므로 if...else문과 return 명령문을 활용하여
1번 다이스의 수 > 2번 다이스 수 > 3번 다이스 수 혹은 1번 다이스의 수 > 3번 다이스 수 > 2번 다이스 수의 경우 1번 다이스 수 반환
2번 다이스의 수 > 1번 다이스 수 > 3번 다이스 수 혹은 2번 다이스의 수 > 3번 다이스 수 > 1번 다이스 수의 경우 2번 다이스 수 반환
3번 다이스의 수 > 2번 다이스 수 > 1번 다이스 수 혹은 3번 다이스의 수 > 1번 다이스 수 > 2번 다이스 수의 경우 3번 다이스 수 반환
위 세 가지 조건을 가지는 함수를 만듭니다.
상금 계산
if (first === second && first === third && second === third) {
return 10000 + first * 1000;
} else if (first === second || first === third || second === third) {
return 1000 + twoSameDice(first, second, third) * 100;
} else if (first !== second && first !== third && second !== third) {
return theBiggestDice(first, second, third) * 100;
}
- 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
- 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
- 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
세 주사위 수가 모두 같은 경우
if (first === second && first === third && second === third) {
return 10000 + first * 1000;
}
주사위 수들이 모두 같은 경우 10000 + first * 1000
을 반환합니다.
두 수의 주사위 수만 같은 경우
else if (first === second || first === third || second === third) {
return 1000 + twoSameDice(first, second, third) * 100;
}
두 수의 주사위만 같은 경우 1000 + twoSameDice(first, second, third) * 100
를 반환합니다.
모든 주사위 수가 다른 경우
else if (first !== second && first !== third && second !== third) {
return theBiggestDice(first, second, third) * 100;
}
모든 주사위 수가 다른 경우 theBiggestDice(first, second, third) * 100
를 반환합니다.
결과 출력
console.log()
console.log(threeDice(a, b, c)); // 600
console.log() 메서드를 통해 threeDice(a, b, c)
를 출력하면 3 3 6
일 경우 1300
이 출력되고, 2 2 2
인 경우 12000
이 출력되고 6 2 5
인 경우 600
이 출력되는 것을 알 수 있습니다.
'Nodejs' 카테고리의 다른 글
[Nodejs][백준] 단계별로 풀어보기 - 5. 함수 (0) | 2022.09.12 |
---|---|
[Nodejs][백준] 단계별로 풀어보기 - 4. 1차원 배열 (0) | 2022.07.27 |
[Nodejs][백준] 단계별로 풀어보기 - 3. 반복문 (0) | 2022.07.22 |
[Nodejs][백준] 단계별로 풀어보기 - 1. 입출력과 사칙연산 (0) | 2022.07.03 |
[Nodejs] nvm으로 Nodejs 버전 관리하기 (0) | 2021.09.29 |