[백준 1316번 문제] 그룹 단어 체커 | 알고리즘 설명 & 문제 풀이 with 자바스크립트(Javascript)

Re_Go·2024년 1월 9일
0

코딩테스트연습

목록 보기
74/98
post-thumbnail

1. 첫번째 문제 풀이(2024-01-09)

이 문제는 문자열을 순회하면서 특정 단어의 연속성이 끊긴 뒤에 다시 등장할 경우에 해당 문자열 자체를 그룹 단어라고 보지 않는 문제인데요.

즉, 'aaabbcc' 가 있다고 한다면 각 단어들은 같은 단어들 끼리 서로 연결이 되어있는 상태이므로 그룹 단어이고, 'aaabbcca'는 알파벳 a가 세 번 연속해서 등장하다가 끊기고, bbcc를 지나 다시 a가 등장하므로 해당 문자열 자체를 그룹 단어라고 보지 않겠다고 하는 것이죠.

그래서 저는 이 문제를 split과 shift를 활용해 해당 문제를 풀었습니다.

const fs = require('fs'); 
const input = fs.readFileSync("/dev/stdin").toString().trim().split('\n');
const n = Number(input[0]); // 입력되는 문자열의 개수
let result = 0;
for(let i = 1; i <= n ; i++){
    let arr = input[i].trim().split(''); //for문을 돌려 문자열 배열을 차례대로 선택하여 split으로 나눈 후 arr에 순회 할당
    let length = arr.length // arr의 배열은 다음 for문에서 바뀔 것(shift) 이므로 해당 배열의 길이를 따로 length에 저장
    let state = true; // 그룹 단어인지 아닌지를 표시하는 변수
    let subArr = []; // 스택
    for(let j = 0 ; j < length-1; j++){ // 선택된 문자열 배열의 길이만큼 for문 실행
        subArr.unshift(arr.shift()); // arr의 앞자리 요소를 꺼내 subArr에 차례대로 적재
        if(subArr[0] !== arr[0]){ // 만약 두 배열의 앞자리 요소가 다를 경우, 즉 연속성이 끊긴 경우
            if(arr.includes(subArr[0]) !== -1){ // 다시 if문으로 subArr에 빼낸 문자가 arr에 존재할 때(indexOf를 이용하여 arr의 현재 문자의 인덱스가 subArr에 존재한다는건 해당 알파벳의 연속성이 끊겼음에도 불구하고 뒤쪽에 살아있음을 의미. 참고로 이 조건은 arr.includes(subArr[0]) 으로도 표현 가능
            state = false; // state를 false로 재할당
            break; // 현재 문자열 배열의 for루프 종료
            }
        }
    }
    result +=  state === true ? 1 : 0; // 현재 단어의 state 상태가 true(그룹 단어) 라면 1을 result에 누적 할당, 아니면 0을 할당 (변화 없음)
}
console.log(result);
profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글