문제
반려동물의 초기 체중과 운동/식사 기록이 주어질 때, 최종 건강 상태를 판별하라.
입력
각 테스트 케이스마다 초기 체중, 이후 명령(E/F)과 값이 주어지며 #으로 종료한다. 0 0이면 입력 끝이다.
출력
각 동물에 대해 사망이면 "RIP", 건강하면 ":-)", 아니면 ":-("를 출력한다.
예제
| 입력 | 출력 |
|---|---|
1 3 E 1 F 2 # 0 0 | 1 :-) |
풀이
운동(E)이면 체중을 줄이고 식사(F)이면 늘리며, 최종 상태를 판정한다.
- E 명령이면 체중에서 값을 빼고, F 명령이면 더한다
- 체중이 0 이하가 되면 사망(RIP)으로 처리한다
- 최종 체중이 초기 체중의 절반 초과 ~ 2배 미만이면 건강(:-)이다
- 그 외는 불건강(:-(이다
핵심 아이디어: 체중이 한 번이라도 0 이하가 되면 이후 명령과 무관하게 사망 처리된다.
코드
const solution = (input) => {
input = input.map((i) => i.split(" "));
const sb = [];
let SN = 0;
while (++SN) {
let [o, w] = input.shift().map(Number);
if (o == 0 && w == 0) break;
let isRip = false;
while (true) {
const [cmd, n] = input.shift();
if (cmd === "#") break;
else if (cmd === "E") { w -= +n; if (w <= 0) isRip = true; }
else { w += +n; }
}
if (isRip) sb.push(`${SN} RIP`);
else if (o / 2 < w && w < o * 2) sb.push(`${SN} :-)`);
else sb.push(`${SN} :-(`);
}
return sb.join("\n");
};
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
console.log(solution(input));복잡도
- 시간: O(N)
- 공간: O(1)