본문 바로가기

CS/알고리즘

[230416] 가장 가까운 같은 글자

반응형

 

 

문제

 

 

풀이

내 풀이

function solution(s) {
    return [...s].map((text, idx) => {
        const char = s.slice(0, idx + 1);
        if(char.indexOf(text) === char.lastIndexOf(text)) return -1;
        return idx - s.slice(0, idx).lastIndexOf(text);
    })
}
  1. 반복문을 돌리고,
  2. 문자열에서 index만큼 문자열의 앞부분을 자른다.
  3. 자른 문자열에서 해당 문자열이 한 번 있으면 -1를 반환.
    1. indexOf와 lastIndexOf가 동일하면, 한 번만 있다는 의미
  4. 그게 아니라면, index에서 index를 포함하지 않는, 앞까지 자른 문자열에서 마지막에 위치한(lastIndexOf) 인덱스의 값을 뺀다. 그 값이 바로 마지막에 나온 문자열과 현재 인덱스 위치와의 거리이다.

 

다른 풀이 - 1

function solution(s) {
    const hash = {};

    return [...s].map((v,i)=>{
        let result = hash[v] !== undefined ? i - hash[v] : -1;
        hash[v] = i;
        return result;
    });
}

알파벳의 위치(인덱스)를 담은 객체를 이용한 풀이다.

 

객체에 알파벳이 key인 값이 없으면 -1를 반환하고,

있다면 (현재 인덱스 - 객체의 value) 를 반환한 후, 해당 인덱스를 객체의 value로 업데이트한다.

 

 

다른 풀이 - 2

const solution = (s) =>
  [...s].map((char, i) => {
    const count = s.slice(0, i).lastIndexOf(char);
    return count < 0 ? count : i - count;
  });

인덱스 앞부분까지 문자열을 자르고, lastIndexOf를 본다.

존재하지 않는다면 count는 -1를 담고 있고, 존재한다면 마지막으로 나타난 index를 담고 있다.

따라서 return count === -1 ? count : i - count 로도 나타낼 수 있겠다.

 

 

 

 

반응형

'CS > 알고리즘' 카테고리의 다른 글

[230419] 멀리 뛰기  (0) 2023.04.19
[230417] 귤 고르기  (0) 2023.04.16
[230416] 푸드 파이트 대회  (0) 2023.04.16
[230416] 점프와 순간 이동  (0) 2023.04.16
[230414] N개의 최소공배수  (0) 2023.04.14