Programmers lv.1 가장 가까운 같은 글자(JS)

김희산·2023년 6월 27일
0

문제

문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.

예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.

  1. b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  2. a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  3. n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다.
  4. a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다.
  5. n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다.
  6. a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이 중 가까운 것은 두 칸 앞이고, 이는 2로 표현합니다.

따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.

문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.


제한사항

  • 1 ≤ s의 길이 ≤ 10,000
  • s은 영어 소문자로만 이루어져 있습니다.

입출력 예

sresult
"banana"[-1, -1, -1, 2, 2, 2]
"foobar"[-1, -1, 1, -1, -1, -1]

정리하자면 해당하는 인덱스의 문자와 똑같은 문자가 몇칸 앞에 존재하는가?가 문제 풀이의 핵심입니다. 존재한다면 떨어져있는 칸 수의 크기를 배열에 담아주면 되고 만약 해당하는 문자와 같은 문자가 없다면 -1을 담아주면 됩니다.
그리고 같은 문자가 여러개 있다면 먼저 발견한 문자의 거리만 고려합니다.

풀이코드

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

먼저 -1을 담고 있는 배열을 하나 만들고 count 변수를 선언한 뒤에 풀이를 시작합니다. -1을 넣은 이유는 문자열의 첫 번째 인덱스에 해당하는 문자는 가장 처음 나오는 문자이기 때문에, 자신보다 앞의 인덱스는 존재하지 않기 때문입니다.그리고 count 변수를 선언해준 이유는 자신이랑 같은 문자가 얼마나 떨어져있는 지를 계산하기 위해서 입니다.

문자열을 하나씩 순회하면서 자신이랑 같은 문자가 얼마나 떨어져있는 가를 계산하기 위해서 count 변수를 선언해주었습니다.

이제, 하나씩 순회하면서 탐색이 끝난 인덱스는 -1을 담고 있는 배열에 push 해주었습니다. 그 이유는 이중 for문에서 임의로 만든 배열을 탐색하면서, 뒤에서부터 탐색하여 현재 인덱스와 같은 문자가 몇 칸 떨어져 있는지 계산하기 위해서입니다.

그리고 자신과 같은 문자를 발견하면 계산된 count(몇칸 떨어져있는지)를 answer 배열에 담아주었고 break를 사용하여 이중for문의 탐색을 종료해주었습니다.

profile
성공은 제로섬 게임이 아니라 주변인들과 함께 나아가는 것이다.

0개의 댓글