[백준] 1316번 - 그룹 단어 체커 (node.js)
드디어 처음으로 포기한 문제가 나왔습니다.
처음엔 쉬워보여서 후훗하면서 심화1은 그렇게 무겁지 않군 하면서 지나가려했는데,
막혀버렸습니다.
간단해보여서 이렇게 저렇게 시도해보고,
이런 저런 메소드있나 찾아보고 했는데,,, 결국 포기하고 답안을 검색했습니다.
찾아보고 나니 맞춘 사람은 초천재 같더라구요.
다른 답변들도 좀 보긴했지만 이 분의 답변이 제일 가독성이 좋고, 깔금해보여서 블로그에 올렸습니다.
전.. 발상이 전혀 다른데 꽂혀있었나봅니다.
똑또칸 사람들 너무 많아.... 중고신입 화이팅!
문제
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다.
단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 단어의 개수 N이 들어온다. N은 100보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 단어가 들어온다. 단어는 알파벳 소문자로만 되어있고 중복되지 않으며, 길이는 최대 100이다.
출력
첫째 줄에 그룹 단어의 개수를 출력한다.
문제풀이
저는 처음에 같은 것을 찾고 그것을 바탕으로 그룹인지 아닌지 판별하기 위해
new Set함수를 사용하고 그랬는데, 전혀 엉뚱한 방향으로 생각을 했던것 같습니다.\
이 분은 천재입니다.
저렇게 할 생각은 전혀 나띵 하지 못했습니다.
알면 쉬운 답안이지만
이를 풀기 위해선 slice, includes, break 를 잘 알고잇어야 합니다.
const fs = require("fs");
const [cnt, ...rest] = fs
.readFileSync("input.txt")
.toString()
.trim()
.split(/\r?\n/);
const solution = () => {
let groupCnt = cnt;
rest.forEach(d => {
for(let i = 0; i < d.length; i++) {
if (d[i] !== d[i + 1] && !!d.slice(i + 1).includes(d[i])) {
groupCnt--;
break;
}
}
})
console.log(groupCnt);
}
solution();
slice
값 메서드 slice()는 원래 문자열을 수정하지 않고 이 문자열의 섹션을 추출하여 새 문자열로 반환합니다.
- indexStart를 기준으로 왼쪽에서 오른쪽으로 indexEnd 까지, indexEnd가 없다면 끝까지 새 문자열로 반환합니다.
- 정수일때는 0부터 왼쪽에서 indexStart, 오른쪽으로가면서 indexEnd or 끝 까지
- 음수일때는 맨뒤에서 부터 자리수전까지가 indexStart, 오른쪽으로 가면서 indexEnd or 끝까지
includes
includes()인스턴스 메서드는 배열 Array의 항목 중 특정 값이 반환되거나 적절하게 포함되어 있는지 여부를 true / false로 반환합니다.
break / continue
- break 명령어는 루프의 실행을 즉시 중지시키고 루프 바깥의 다음 코드로 실행 흐름을 이동시킵니다.
- break는 보통 특정 조건이 만족될 때 불필요한 반복을 방지하고 루프를 종료하는 데 사용됩니다. 예를 들어, 특정 값을 찾았을 때 더 이상 검색할 필요가 없는 경우에 유용합니다.
- continue 명령어는 루프의 나머지 부분을 실행하지 않고, 루프의 다음 반복(iteration)으로 즉시 이동합니다.
- continue는 현재 반복에서 더 이상 작업을 수행할 필요가 없을 때, 다음 반복으로 건너뛰기 위해 사용됩니다. 이는 특정 조건을 무시하고 루프를 계속 실행하고자 할 때 유용합니다.
for (let i = 0; i < 10; i++) {
if (i === 5) {
break; // i가 5일 때 루프를 완전히 종료
}
console.log(i); // 0, 1, 2, 3, 4만 출력됨
}
for (let i = 0; i < 10; i++) {
if (i === 5) {
continue; // i가 5일 때 이번 반복을 건너뛰고 다음 반복으로 이동
}
console.log(i); // 0, 1, 2, 3, 4, 6, 7, 8, 9 출력됨
}
느낀점
확실히 코딩테스트는 좀 시간을 갈아 넣어서 여러가지 문제를 많이 풀어보고
눈에 익혀야하는 것 같다.
덕분에 여러가지 메소드의 사용방법과 신박한 방법들을 알아가게 되어 재밌다.
참조!
[Javascript] 백준 1316번 문제, 그룹 단어 체커 (feat.slice, includes, Node.js)
1316번 문제, 그룹 단어 체커 문제링크 1316번: 그룹 단어 체커 그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가
aiday.tistory.com
'코딩 테스트' 카테고리의 다른 글
[백준] 2292번 - 벌집 (node.js) (1) | 2024.04.25 |
---|---|
[백준] 2903번 - 중앙 이동 알고리즘 (node.js) (0) | 2024.04.23 |
[백준] 2563번 - 색종이 (node.js) (0) | 2024.04.23 |
[백준] 2444번 - 별 찍기 - 7 (node.js) (0) | 2024.04.17 |
[백준] 1157번 - 단어 공부 (node.js) (0) | 2024.04.17 |
댓글