본문 바로가기

알고리즘 문제풀이

가장 가까운 같은 글자

문제 설명

문자열 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
2
3
4
5
6
7
8
9
10
11
12
13
function solution(s) {
    let arr = new Map();
    let answer = [];
    for (let i = 0; i < s.length; i++) {
        if (arr.get(s[i]) !== undefined) {
            answer.push(i - arr.get(s[i]));
        } else {
            answer.push(-1);
        }
        arr.set(s[i], i);
    }
    return answer;
}
cs

 

풀이

중복을 허용하지 않는 Map 자료구조를 사용하여 풀었습니다

for 문을 돌면서 Map에 값이 이미 존재한다면

현재 인덱스 번호 ( i ) 에서 이전에 나왔던 같은 문자열 인덱스 번호인 Map.get(s[i]) 를 빼면 결과값이 나옵니다 

Map에 없는 문자일때는 -1을 해줍니다

 

다른 알고리즘 문제들

https://github.com/LeeJoongWon/collection-of-problems

'알고리즘 문제풀이' 카테고리의 다른 글

시소 짝궁  (0) 2023.01.25
올바른 괄호  (0) 2023.01.25
최솟값 만들기  (0) 2023.01.25
JadenCase 문자열 만들기  (0) 2022.12.15
최댓값과 최솟값  (0) 2022.12.14