본문 바로가기

백준/JavaScript

[JS] 백준 심화 1 - 마지막 이야기

728x90

 

 

드디어 심화 1 단계의 마지막이다!!

 

 

문제 1316번

https://www.acmicpc.net/problem/1316

 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때

www.acmicpc.net

 

이 문제를 보고, 글자 하나하나 비교해줘야하나 고민하다가 다른 분의 풀이를 봤다.

그런데 풀이를 봐도 이해가 안 되는 부분이 있어서 한참 보는데, 차례대로 생각해보니까 드디어 이해가 갔다.

 

이해한 내용을 토대로 내가 따로 작성해봤다.

 

const readFileSyncAdress = process.platform === 'linux' ? '/dev/stdin':'./input.txt'
const input = require("fs").readFileSync(readFileSyncAdress).toString().split('\n');

const n = input[0]; //단어의 개수
let count = 0;  //그룹단어의 개수

for(let i=1;i<=n;i++){
    const word = input[i];
    let letter = [];    //(그룹단어가 아닌데)중복되는지 확인하기 위한 배열
    let isGroup = true; //그룹단어 여부
    for(let j=0;j<word.length;j++){
        if(letter.indexOf(word[j])===-1){//배열에 없는 알파벳이면
            letter.push(word[j]);   //letter 배열에 해당 알파벳 넣기

        } else{ //배열에 있는 알파벳이면
            if(letter.indexOf(word[j])!==letter.length-1){  //해당 알파벳의 인덱스가 마지막 인덱스인지 확인  
                isGroup = false;    //마지막 인덱스와 다르면 (그룹단어가 아닌데)중복된 것이므로 false
                break;
            }
        }
    }

    //그룹단어이면(true) 개수를 1 카운트
    if(isGroup){
        count += 1;        
    }
}

console.log(count);

 

 

입력받은 단어의 개수만큼 for문을 돌린다. 그리고 각 단어를 단어의 길이만큼 반복문을 해주어 그룹단어인지 여부를 판단한다. 그룹단어인지 여부를 판단할 때 해당 알파벳이 letter 배열의 어떤 인덱스인지 letter.indexOf(word[j])를 이용하여 배열에 없는 알파벳이면(-1) 그 알파벳을 letter 배열에 넣어준다(push). 만약, 배열에 있는 알파벳이면 해당 알파벳의 인덱스가 letter의 마지막 인덱스인지 확인한다. 그 이유는 마지막 인덱스면 연속으로 중복되는 것이기 때문에 그룹단어일 수도 있기 때문이다. 그러나 마지막 인덱스가 아니면 연속으로 중복되는 것이 아니기 때문에 그룹단어 여부를 확인해주는 isGroup변수에 false를 넣어준다. 그룹단어 여부가 아닌 것이 확정되었으니 break로 반복문을 빠져나온다. 

 

그렇게 한 단어의 반복문이 끝나면 그룹단어 여부를 확인하여 개수를 1 카운트 해준다.

 

 

[참고] https://velog.io/@rkio/%EB%B0%B1%EC%A4%80-Javascript-1316

 

 

 

 

문제 25206번

https://www.acmicpc.net/problem/25206

 

25206번: 너의 평점은

인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다! 치

www.acmicpc.net

 

 

이 문제는 평점들을 변수에 저장해두고 사용하면 될 것 같아서 그런 식으로 풀다가 입력받은 값을 좀 더 간단하게 나눌 방법이 없을까 하고 다른 풀이를 찾아보다가 쉽게 나눌 수 있는 방법을 찾아서 참고했다.

 

const readFileSyncAdress = process.platform === 'linux' ? '/dev/stdin':'./input.txt'
const input = require("fs").readFileSync(readFileSyncAdress).toString().trim().split('\n').map(x => x.split(' '));

const score = {
    "A+": 4.5,
    "A0": 4.0,
    "B+": 3.5,
    "B0": 3.0,
    "C+": 2.5,
    "C0": 2.0,
    "D+": 1.5,
    "D0": 1.0,
    "F": 0.0
}
let sum=0;
let total=0;

for(let [subject,num,grade] of input){
    
    if(grade === 'P'){
        continue;
    }
    sum += Number(num) * score[grade];
    total += Number(num);
}

console.log(sum/total);

 

 

이는 입력받을 때 map을 통해서 공백을 기준으로 나눴다. 그리고 for문에서 3개의 입력을 let [subject, num, grade] of input으로 표현하여 각각의 값을 쉽게 사용할 수 있도록 하였다.

 

 

[참고] https://velog.io/@ahrkwltlarh/%EB%B0%B1%EC%A4%80-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-25206%EB%B2%88

 

 

 

드디어 심화 1 단계가 끝났다~~~

확실히 점점 갈수록 혼자 힘으로 풀기는 조금 어려워졌지만 다른 풀이를 참고하여 풀다보니 어느정도 풀 수는 있을 것 같다. 앞으로도 파이팅~~~!!

 

 

 

 

 

728x90