자료구조 & 알고리즘/코딩테스트

[JavaScript/코딩테스트] Lv01 <가장 가까운 같은 글자>

칠구의 스터디 2024. 4. 8. 16:03

https://school.programmers.co.kr/learn/courses/30/lessons/142086

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 출처

 

가장 가까운 같은 글자

[문제 설명]
문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다. 예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다. b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다. a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다. n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다. a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다. n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다. a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다. 따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다. 문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.

[제한사항]
1 ≤ s의 길이 ≤ 10,000
s은 영어 소문자로만 이루어져 있습니다.

[입출력 예]
 s                 result
"banana" [-1, -1, -1, 2, 2, 2]
"foobar"   [-1, -1, 1, -1, -1, -1]

 

문제 자체는 설명을 잘 읽어보면 어렵지 않은 문제이다

 

function solution(s) {
    let answer = [];
    
    for (let i = 0; i < s.length; i++) {
        let check = false; 
        
        for (let j = i - 1; j >= 0; j--) {
            if (s[i] === s[j]) {
                answer.push(i - j); 
                check = true; 
                break; 
            }
        }
        
        if (!check) {
            answer.push(-1); 
        }
    }
    
    return answer;
}

이건  for문을 2번 사용해서 중복 체크를 해서 푸는 방법이다

중복되는 값이 있다면 둘의 인덱스 값을 빼서 값을 구하는 방법이다

 

function solution(s) {
    let result = [];
    let tmp = [];
    
    for(let i = 0; i < s.length; i++){
        if(!tmp.includes(s[i])){
            result.push(-1);
            tmp.push(s[i]);
        } else if(tmp.includes(s[i])){
            result.push(i - tmp.lastIndexOf(s[i]));
            tmp.push(s[i]);
        }
        
    }
    return result;
}

이건 lastIndexOf를 사용한 방법이다 

중복확인을 위한 tmp 배열을 이용해서 문자가 중복시

현재 위치에서 마지막으로 등장한 위치를 빼서 답을 구하는 방법이다

 


후기

나는 for문을 2번 사용해서 비교를 하는 방법만 생각했는데

배열을 2번 받아 lastIndexOf로 푸는 방법도 있다는 것을 알게되었다.