출처: 백준 온라인저지
https://www.acmicpc.net/problem/1316
문제
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 단어의 개수 N이 들어온다.
출력
첫째 줄에 그룹 단어의 개수를 출력한다.
나의 답안 (오답)
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
// count 초기값은 그룹 단어의 갯수
let count = input[0];
for (let i = 1; i < input.length; i++) {
// 그룹 단어에서 체크를 실행할 개별 단어
const target = input[i];
// 단어에서 각 알파벳의 다음다음 index 부터 일치하는 알파벳이 있는지 체크
// 바로 다음 알파벳은 일치해도 상관 없기 때문에 다음다음 index 부터 체크
for (let j = 0; j < target.length - 2; j++) {
for (let k = j + 2; k < target.length; k++) {
// 만약 연속되지 않는 위치에 동일한 알파벳이 있다면 해당 단어는 count 에서 제외
if (target[j] === target[k] && target[j + 1] !== target[k]) {
count--;
}
break;
}
}
}
console.log(count);
예제 케이스는 모두 통과하였지만,
코드 제출 결과 역시나 틀렸습니다. 라는 메시지를 마주했다.
코드를 다시 찬찬히 살펴보니 이 역시 예외 케이스에서 제대로 동작하지 않았다.
j index와 j+2 인 k index 의 letter만 비교하다보니
예를 들어 hhh 의 경우, 세문자가 연속하므로 그룹단어에 어긋나지 않지만 기존의 내 로직에서는 가운데 문자는 고려하지 않으므로
그룹문자열이 아니라는 값을 뱉어냈다.
따라서 target[j +1 ] !== target[k] 라는 조건을 하나 더 추가하여 j, j+2 문자열 비교와 더해 j+1 과 j+2 문자열을 비교할 수 있도록 추가했는데, 이 역시 정답을 출력하지 못했다.
새로운 답안
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
// 체크할 문자열 갯수
const count = input[0];
// 그룹 단어 갯수 count
let groupWordCount = 0;
for (let i = 1; i <= count; i++) {
// 체크할 문자열
const word = input[i];
// 문자열 체크에 필요한 배열
const chkArr = [];
// 그룹 단어인지 확인
let isGroupWord = true;
for (let j = 0; j < word.length; j++) {
// 체크할 문자열의 letter가 새로운 chkArr 없다면 넣어준다.
if (chkArr.indexOf(word[j]) === -1) {
chkArr.push(word[j]);
} else {
// 체크할 문자열의 letter 가 chkArr에 존재하지만
// 그 idx가 chkArr.length가 아니라면,
// 연속되지 않는 위치에 같은 문자열이 존재한다.
if (chkArr.indexOf(word[j]) !== chkArr.length - 1) {
// => 그룹 단어가 아니다.
isGroupWord = false;
break;
}
}
}
// 그룹 단어인 것들은 true 값이므로, true 값일 때 count++
if (isGroupWord) {
groupWordCount++;
}
}
console.log(groupWordCount);
문제가 틀렸을 때 로직 자체를 다시 고민하지 않고, 틀린 케이스에 대해서만 로직을 추가하다보니 내가 생각하지 못한 예외 케이스에서는 대응하지 못해 정답을 찾을 수 없었다.
역시나, 입출력 예제에 의존하지 않고 로직을 생각하고 구현해내는 연습이 더 필요하다.
'알고리즘' 카테고리의 다른 글
백준 JS | 4948번 베르트랑 공준 (0) | 2022.06.10 |
---|---|
백준 JS | 2775번 부녀회장이 될테야 (0) | 2022.05.26 |
백준 JS | 2941번 크로아티아 알파벳 (0) | 2022.05.16 |
백준 JS | 4673번 셀프 넘버 (0) | 2022.05.05 |
백준 온라인저지 100% 활용하기 ( vscode에서 nodejs 디버깅 모드 사용) (1) | 2022.05.02 |