개발/Algorithm

[leetcode 821. Shortest Distance to a Character] 가장 짧은 문자거리

개발 여행 2021. 11. 24. 20:24
728x90

설명

문자열 s가 주어질 때 s의 각 문자가 c와 떨어진 최단거리를 반환하는 문제이다.

예를 들어, s = 'test' , c = 'e' 일 때 [1, 0, 1, 2]를 반환해야 한다.

(t는 e에서 1만큼 떨어져있고, e는 0, s는 1, 마지막 t는 2만큼 떨어져있기 때문이다.)

 

Problem

Given a string s and a character c that occurs in s, return an array of integers answer where answer.length == s.length and answer[i] is the distance from index i to the closest occurrence of character c in s.

The distance between two indices i and j is abs(i - j), where abs is the absolute value function.

 

Example 1:

Input: s = "loveleetcode", c = "e"
Output: [3,2,1,0,1,0,0,1,2,2,1,0]
Explanation: The character 'e' appears at indices 3, 5, 6, and 11 (0-indexed).
The closest occurrence of 'e' for index 0 is at index 3, so the distance is abs(0 - 3) = 3.
The closest occurrence of 'e' for index 1 is at index 3, so the distance is abs(1 - 3) = 2.
For index 4, there is a tie between the 'e' at index 3 and the 'e' at index 5, but the distance is still the same: abs(4 - 3) == abs(4 - 5) = 1.
The closest occurrence of 'e' for index 8 is at index 6, so the distance is abs(8 - 6) = 2.

Example 2:

Input: s = "aaab", c = "b"
Output: [3,2,1,0]

 

Constraints:

  • 1 <= s.length <= 104
  • s[i] and c are lowercase English letters.
  • It is guaranteed that c occurs at least once in s.

풀이

아래의 방법은 O(n)의 시간복잡도를 가진다.

 

1) 먼저 문자열의 길이만큼 반복문이 돌면서 각 캐릭터가 c와 같은지 체크

2) 같으면 distance를 0으로 할당하고 result에 입력

3) 같지 않으면 distance에 +1을 하고 distance를 result에 입력

(3번까지의 과정이 c가 왼쪽에 존재할 때의 거리를 result에 저장해놓은 것이다.)

 

4) 반대로 for문을 뒤에서부터 돌면서 각 캐릭터가 c와 같은지 체크

5) 같으면 distance를 0으로 할당하고

6) 같지 않으면 distance에 +1을 하고

7) result에 저장되어 있는 값과 비교해서 더 작은 값을 result[i]에 할당

(4번부터 7번까지의 과정이 c가 오른쪽에 존재할 때의 거리를 체크한 것이다.)

function ShortestDistance(s, c) {
  const result = [];
  let distance = 105;

  for (const char of s) {
    if (char === c) {
      distance = 0;
      result.push(distance);
    } else {
      distance++;
      result.push(distance);
    }
  }

  distance = 105;

  for (let i = s.length - 1; i >= 0; i--) {
    if (s[i] === c) {
      distance = 0;
    } else {
      distance++;
      result[i] = Math.min(result[i], distance);
    }
  }

  return result;
}
728x90