티스토리 뷰

1. 두 수 비교하기

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

문제

두 수 비교하기

문제
두 정수 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를 활용하여

ab보다 큰 경우 ">"을,
ab보다 작은 경우 "<"을,
ab가 같은 경우 "=="

return 명령문을 통해 반환하게 합니다.

console.log()

console.log(compare(a, b)); // <

12를 대입하였을 경우 < 가 출력되고,
10, 2를 대입하였을 경우 >가 출력되고,
5, 5를 대입하였을 경우 ==가 출력되는 것을 알 수 있습니다.

2. 시험 성적

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

문제

시험 성적

문제
시험 점수를 입력받아 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. 윤년

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

문제

윤년

문제
연도가 주어졌을 때, 윤년이면 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. 사분면 고르기

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

문제

사분면 고르기

문제
흔한 수학 문제 중 하나는 주어진 점이 어느 사분면에 속하는지 알아내는 것이다. 사분면은 아래 그림처럼 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. 알람 시계

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

문제

알람 시계

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

상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다.

이런 상근이를 불쌍하게 보던, 창영이는 자신이 사용하는 방법을 추천해 주었다.

바로 "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

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은 자정을 의미하기 때문에 만약 시간을 의미하는 매개변수 hour0보다 작으면 hour23이라고 설정해줍니다.

return
function alarm(hour, minute) {
  minute -= 45;
  if (minute < 0) {
    minute += 60;
    hour -= 1;
    if (hour < 0) {
      hour = 23;
    }
  }
  return [hour, minute];
}

if...else문을 통해서 계산된 hourminutereturn 명령문을 통해 배열로 반환해줍니다.

배열 구조 분해
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 4022 55가 출력되는 것을 알 수 있습니다.

6. 오븐 시계

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

문제

오븐 시계

문제
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 -= 60hour += 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];
}

위의 과정들을 통해 계산된 hourminutereturn 명령문을 통해 배열로 반환해줍니다.

배열 구조 분해
[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. 주사위 세개

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

문제

주사위 세개

문제
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;
  }
}

  1. 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
  2. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
  3. 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×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. 1번 다이스와 2번 다이스와 같은 수이면서, 1번 다이스는 3번 다이스와 다른 수이면 1번 다이스 반환

    같은 다이스이기 떄문에 1번과 2번, 둘 중에 뭘 반환하든 상관이 없다.

  2. 1번 다이스와 3번 다이스와 같은 수이면서, 1번 다이스는 2번 다이스와 다른 수이면 1번 다이스 반환

  3. 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. 1번 다이스의 수 > 2번 다이스 수 > 3번 다이스 수 혹은 1번 다이스의 수 > 3번 다이스 수 > 2번 다이스 수의 경우 1번 다이스 수 반환

  2. 2번 다이스의 수 > 1번 다이스 수 > 3번 다이스 수 혹은 2번 다이스의 수 > 3번 다이스 수 > 1번 다이스 수의 경우 2번 다이스 수 반환

  3. 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;
}

  1. 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
  2. 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
  3. 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×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이 출력되는 것을 알 수 있습니다.

댓글