백준 1316번 그룹 단어 체커-JS

yugyeongKim·2021년 10월 17일
0

백준

목록 보기
14/52
post-custom-banner


정말 뻘짓 최강 많이한 문제

- 내가 처음에 뻘짓한 코드

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
let N = input.shift();
//2. 나온단어랑같다 근데 직전문자와 같다 - 그룹단어
//3. 나온단어랑같다 근데 직전문자와 다르다 - 그룹단어x
// 그룹단어가 되는 경우
// 1. 중복되는 문자가 없는 단어
// 2. 중복되는 문자가 있으면 그 문자가 연속하여 나오는 경우
// * 연속되지 않게 나오는 중복문자인 경우 그룹단어가 아니다
let uniqArr = []
let count = 0;
let resultNum = 0;
for(let i=0; i < N; i++) {
    let arr = input[i].split('');
    uniqArr = [];
    count = 0;

    // 중복제거문자 배열(uniq) 생성
    arr.forEach(element => {
        if(!uniqArr.includes(element)) {
            uniqArr.push(element);
        }
    });
    //빈도가 2이상일 때 - 직전과 같 or 직전과 다르다 를 구분
    let sameCount = 0;
    for(let j=0; j < arr.length; j++) {
        if(uniqArr.includes(arr[j])) {
            sameCount++;
        } 
        if (sameCount > 1) {
            if(arr[j] === arr[j+1]) {
                count++; //count가 올라가면 중복이다가 0(떨어진곳에서 중복발생)이되면 그룹단어 탈락
            } else { count = 0; }
        }
    }

    console.log(sameCount)
    let s = '';
    let a = '';
    uniqArr.forEach(e => {s += e});
    arr.forEach(e => {a += e});
    console.log(s)
    console.log(a)
    console.log(count)

    if(s === a) { //중복되는 문자가 없는 단어
        resultNum++;
    } else if(count > 0) {
        resultNum++;
    }
}
console.log(resultNum);

이건 심지어 vscode에서도 안돼

- 어째어째 되긴 한 코드(확인용 콘솔 많음)

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
let N = input.shift();
//1. 중복된 문자가 없는 단어
//2. 중복된 문자가 있으되 그 문자가 직전문자와 동일한 단어
//***  단어중 중복된 문자를 찾는것이 관건
let count = 0;
let group = 5;
let dic = {};
for(let x=0; x < N; x++) {
    let str = input[x];
    let strWordArr = str.split(''); //각 문자들의 배열
    dic = {};
    // aabbbccb   happy
    group = 5;
    for(let i = 0; i < strWordArr.length-1; i++) {
        for(let j=i+1; j < strWordArr.length; j++) {
            //console.log(strWordArr[i],strWordArr[j]);
            if(strWordArr[i] === strWordArr[j] && group !== -1) {
                if(dic[strWordArr[i]] >= 1) {
                    dic[strWordArr[i]] = dic[strWordArr[i]] + 1;
                } else {dic[strWordArr[i]] = 1;}
                if(strWordArr[j] === strWordArr[j-1]) {
                    group = 1;
                } else {
                    group = -1;
                    console.log('d');
                }
            } 
        }
        console.log('----------');
    }
    console.log('=============================');
    if(Object.keys(dic).length === 0 || group === 1) {
        count++;
    }
}
console.log(count);

- 위와 동일하나 콘솔없는 경우

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
let N = input.shift();
let count = 0;
let group = 5;
let dic = {};

for(let x=0; x < N; x++) {
    let str = input[x];
    let strWordArr = str.split(''); //각 문자들의 배열
    dic = {};
    group = 5;
    for(let i = 0; i < strWordArr.length-1; i++) {
        for(let j=i+1; j < strWordArr.length; j++) {
            if(strWordArr[i] === strWordArr[j] && group !== -1) {
                if(dic[strWordArr[i]] >= 1) {
                    dic[strWordArr[i]] = dic[strWordArr[i]] + 1;
                } else {dic[strWordArr[i]] = 1;}
                if(strWordArr[j] === strWordArr[j-1]) {group = 1;} 
                else { group = -1;}
            } 
        }
    }
    
    if(Object.keys(dic).length === 0 || group === 1) {
        count++;
    }
}

console.log(count);

저 코드는 앞에 주석을 기초로 한 코드이다.

  1. 딕셔너리 형태로 중복된 문자가 있으면 그 문자를 key값으로, 그 문자의 빈도수를 value값으로 지정 -> 이것으로 딕셔너리가 빈값(중복된 문자가 없는 문자)인지 구별 가능
  2. 중복된 문자가 있을 경우, 그 문자가 직전 문자와 동일한지 확인
    2-1. 동일할 경우, group변수의 값으로 1을 할당
    2-2. 그렇지 않을 경우, group변수의 -1을 할당
  3. 중복된 문자가 있을 경우에 추가로 "group변수의 값이 -1(중복된 문자가 직전문자와 동일하지 않는 경우=그룹단어 탈락)이 아닌 경우"라는 조건을 달아준다. -> 그룹단어에 탈락하지 않는 동안만 if문이 돌아가게 하기 위해
  4. 딕셔너리 값이 없는 경우(딕셔너리 길이가 0인 경우) count++, group변수가 1인 경우(중복된 문자가 직전 문자와 동일 경우) count++

아무리 생각해도 내가 너무 복잡하게 푼거 같다. 특히 저 끊임없는for문과 if문들의 향연은 보기만 해도 아찔하다.

post-custom-banner

0개의 댓글