백준/ Silver 3 문제 , 백준 Node.js 자바스크립트 9342 , 염색체
✔️Check Point ! ( 해당사항 ✓체크 )
1. 막힘 없이 수월하게 풀린 문제인가?
2. 1시간이내로 풀렸던 문제인가?
3. 1시간 이상 or 며칠을 두고 풀어봤더니 풀린 문제인가?
4. 시간을 써도 도무지 풀 수 없는 문제인가?
5. 솔루션을 찾아봤는가?
-------------------------------------------------------------------------------------------
난이도 체감 🧑💻
1. 최상
2. 상
3. 중
4. 하
이해도 🙆♂️
1. 완벽히 이해
2. 다소 헷갈리는 부분들이 있음
3. 이해 못함
덧붙일 말 🏷️
규칙에 부합하는 단어는 최소 세단어 이상 최대 5단어 이하이다. 이거만으로도 많이 가려낼수 있음.
문제 출처 🏠
https://www.acmicpc.net/problem/9342
요구사항 📋
문자열이 규칙을 만족하는지 확인해라.
1. 문자열은 {A, B, C, D, E, F} 중 0개 또는 1개로 시작해야 한다.
2. 그 다음에는 A가 하나 또는 그 이상 있어야 한다.
3. 그 다음에는 F가 하나 또는 그 이상 있어야 한다.
4. 그 다음에는 C가 하나 또는 그 이상 있어야 한다.
5. 그 다음에는 {A, B, C, D, E, F} 중 0개 또는 1개가 있으며, 더 이상의 문자는 없어야 한다.
규칙에 부합하는 단어라면 'infected!' 출력, 아니라면 'Good' 출력.
해결 전략 📝
문자열이 입력되면, 스택에 차례대로 담는다.이때, 연속으로 같은단어라면 담지 않는다.
정리된 단어가 규칙에 부합하는지 확인.
2번,3번,4번 규칙 때문에 'AFC'라는 단어는 무조건 포함되어있어야한다.
기능 목록 📲
1. 연속되는 단어들을 정리 => buildStack 함수
2. 규칙에 부합하는지 확인. => checkRule 함수
예외사항 ⚠️
1. 정리한 최종 단어가 3글자 이하로 정리되는 경우
2. 정리한 최종 단어나, 스택의 길이가 5가 넘어가는 경우
정답 💯
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
const t = input.shift();
let [...test] = input;
test = test.map((v) => v.trim());
function solution(T, testCase) {
function buildStack(Str) {
let stack = [];
for (let j = 0; j < Str.length; j++) {
if (stack[stack.length - 1] !== Str[j]) {
stack.push(Str[j]);
}
if (stack.length > 5) return false;
}
if (stack.length < 3) return false;
return checkRule(stack.join(""));
}
function checkRule(result) {
const alpha = ["A", "B", "C", "D", "E", "F"];
if (result.length === 3) {
if (result !== "AFC") return false;
else return true;
} else if (result.length === 4) {
for (let i = 0; i < alpha.length; i++) {
if (alpha[i] + "AFC" === result) return true;
if ("AFC" + alpha[i] === result) return true;
}
return false;
} else if (result.length === 5) {
for (let i = 0; i < alpha.length; i++) {
for (let j = 0; j < alpha.length; j++) {
if (alpha[i] + "AFC" + alpha[j] === result) return true;
}
}
return false;
}
return false;
}
for (let i = 0; i < T; i++) {
let str = testCase[i].split("");
let result = buildStack(str);
if (result) {
console.log("Infected!");
} else {
console.log("Good");
}
}
}
solution(Number(t), test);
느낀점 🧑💻
각 기능을 좀 나눠서 함수로 표현해볼려고 노력해봤다. 조금 더 가독성이 높아지지 않았나 싶다.
반응형
'알고리즘 공부 > 백준 - 자바스크립트' 카테고리의 다른 글
백준/ Gold 3 문제 , 백준 Node.js 자바스크립트 1005 , ACM Craft [위상정렬, DP] (0) | 2022.11.01 |
---|---|
백준/ Gold 3 문제 , 백준 Node.js 자바스크립트 2252 , 줄 세우기 [위상 정렬] (0) | 2022.11.01 |
백준/ Gold 4 문제 , 백준 Node.js 자바스크립트 17928 , 오큰수 (0) | 2022.10.29 |
백준/ Gold 5 문제 , 백준 Node.js 자바스크립트 1068 , 트리 (0) | 2022.10.27 |
백준/ Silver 1 문제 , 백준 Node.js 자바스크립트 14675 , 단절점과 단절선 (0) | 2022.10.27 |