Algorithm/Baekjoon(Node.js)

[JavaSrcipt] Baekjoon - 10809 : 알파벳 찾기 (indexOf)

비망노트 2021. 9. 11. 17:11

문제

알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어 S가 주어진다. 단어의 길이는 100을 넘지 않으며, 알파벳 소문자로만 이루어져 있다.

출력

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.

만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.

 

예제입력
baekjoon
예제출력
1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

 

❌ 풀이

const input=require('fs').readFileSync('/dev/stdin').toString();
let str = input.split('');

let arr = [];
let asc = 97;

for(let i=0;i<26;i++){
    arr[i] = String.fromCharCode(asc);
    asc += 1;
}
//[ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']


for(let p=0;p<26;p++){
    for(let j=0;j<str.length;j++){ 
        
        if(arr[p]==str[j]){
            arr[p] = j;    
        }
    }
}
//[ 1,  0, 'c', 'd', 2, 'f', 'g', 'h', 'i', 4, 3, 'l', 'm', 7,  5, 'p', 'q',
'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']


for(let l=0;l<26;l++){
    if(arr[l]>=0){
    arr[l]=arr[l];
    }
    else{
    arr[l]=-1;
    }
}
//[ 1,  0, -1, -1,  2, -1, -1, -1, -1,  4,  3, -1, -1,  7,  5, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1]

console.log(arr.join(' '));
//1 0 -1 -1 2 -1 -1 -1 -1 4 3 -1 -1 7 5 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

첫 for문으로 소문자 a-z 까지 배열을 생성하고

입력받은 baekjoon을 하나씩 떼어 해당 알파벳과 맞으면 j를 배열에 넣어

중간중간 arr의 값이 위의 코드와 같이나오는데 

마지막에 arr를 ' ' join시켜  해당답이 나오긴했으나 정답이 아니었다.

생각이 깔끔하게 정리가안돼서 그런가 매번 풀어보고나면 코드가 지저분해서

간소화시켜보려고해도 되지않는다..

 

✅ 다른분의 풀이

const input=require('fs').readFileSync('/dev/stdin').toString();

let answer = [];

for(let i=97;i<=122;i++){
    answer.push(input.indexOf(String.fromCharCode(i)));
}
console.log(answer.join(' '))

answer배열에 push한다.

input배열에서 indexOf로 찾는다 fromCharCode(i) 즉 97을 fromCharCode 하면 a이므로

a-z 까지를 b a e k j o o n 배열에서 찾는다.

찾지못할경우 -1이 반환된다.

input.indexOf('a')

b a e k j o o n 에서 a를 찾아주세요. 없다면 -1이고 있다면 해당 인덱스를 answer에 넣어주세요.

b a e k j o o n 에서 b를 찾아주세요.  - - - - - -122 즉 z 까지

 

✅ indexOf

const beasts = ['ant', 'bison', 'camel', 'duck', 'bison'];

console.log(beasts.indexOf('bison'));
// expected output: 1

// start from index 2
console.log(beasts.indexOf('bison', 2));
// expected output: 4

console.log(beasts.indexOf('giraffe'));
// expected output: -1

구문

arr.indexOf(searchElement[, fromIndex])

searchElement
배열에서 찾을 요소입니다.

fromIndex Optional

검색을 시작할 색인입니다. 인덱스가 배열의 길이보다 크거나 같은 경우 -1이 반환되므로 배열이 검색되지 않습니다.

반환값

배열 내의 요소의 최초의 인덱스. 발견되지 않으면 -1.

var array = [2, 9, 9];
array.indexOf(2);     // 0
array.indexOf(7);     // -1
array.indexOf(9, 2);  // 2
array.indexOf(2, -1); // -1
array.indexOf(2, -3); // 0

 

-출처

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

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf