DEV

LeetCode #3110쉬움

3110. 문자열의 점수

3110. Score Of A String/solutions/5241514/3110 Score Of A String/

String
해설 읽기 3
javascript

문제 설명

문자열 s가 주어집니다. 문자열의 점수는 인접한 문자들의 ASCII 값의 절대 차이의 합으로 정의됩니다. 문자열 s의 점수를 반환하세요.

⚠️제약 조건

  • 2 <= s.length <= 100

  • s는 소문자 영문자로만 구성됩니다.

해결 방법

🎯접근 방식

이 문제는 문자열의 인접한 문자들 간의 ASCII 값 차이의 절대값을 합산하여 점수를 계산하는 문제입니다. 주어진 문자열을 순회하면서 각 문자에 대해 ASCII 값을 구하고, 인접한 문자들 간의 차이를 계산하여 그 절대값을 누적합으로 더합니다. 핵심 아이디어는 문자열을 순차적으로 탐색하면서 인접한 문자들의 ASCII 값 차이를 누적하여 최종 점수를 구하는 것입니다.

솔루션 코드

복잡도 분석

시간 복잡도:O(n)
공간 복잡도:O(n)

💡상세 설명

이 문제는 주어진 문자열 s의 점수를 계산하는 문제입니다. 점수는 문자열의 인접한 문자들의 ASCII 값의 절대 차이의 합으로 정의됩니다. 이제 이 문제를 해결하는 코드를 단계별로 설명하겠습니다.

1. 알고리즘의 핵심 아이디어

주어진 문자열의 각 문자에 대해, 해당 문자의 ASCII 값을 구하고, 인접한 문자들 사이의 ASCII 값 차이를 계산하여 그 절대값을 모두 더하는 것이 핵심 아이디어입니다. 이렇게 하면 문자열의 점수를 쉽게 계산할 수 있습니다.

2. 코드의 주요 로직 설명

코드는 두 개의 주요 반복문을 사용하여 문제를 해결합니다:

  • 첫 번째 반복문에서는 문자열의 각 문자를 순회하며, 각 문자의 ASCII 값을 charNums 배열에 저장합니다.
  • 두 번째 반복문에서는 charNums 배열을 순회하며, 인접한 두 ASCII 값의 차이의 절대값을 계산하여 sum 변수에 누적합니다.

3. 각 단계별 동작 과정

  1. 문자열의 ASCII 값 변환:

    • let charNums = []; : 빈 배열을 선언하여 각 문자의 ASCII 값을 저장할 준비를 합니다.
    • for (let char of s) { charNums.push(char.charCodeAt()) } : 문자열 s의 각 문자를 순회하면서 char.charCodeAt()을 통해 해당 문자의 ASCII 값을 얻어 charNums 배열에 추가합니다.
  2. 점수 계산:

    • let sum = 0; : 점수를 저장할 변수를 초기화합니다.
    • for (let i = 0; i < charNums.length - 1; i++) { ... } : charNums 배열을 순회하며 인접한 두 값의 차이를 계산합니다.
    • let calc = Math.abs(charNums[i] - charNums[i + 1]) : 인접한 두 ASCII 값의 차이를 계산하고 그 절대값을 calc에 저장합니다.
    • sum += calc : calc 값을 sum에 누적하여 최종 점수를 계산합니다.
  3. 결과 반환:

    • return sum : 계산된 점수를 반환합니다.

4. 핵심 변수들의 역할

  • charNums: 문자열의 각 문자의 ASCII 값을 저장하는 배열입니다.
  • sum: 최종 점수를 저장하는 변수로, 인접한 문자들의 ASCII 값 차이의 절대값을 누적합니다.
  • calc: 두 인접한 문자 사이의 ASCII 값 차이의 절대값을 임시로 저장하는 변수입니다.

5. 왜 이 방법이 효과적인지

이 방법은 문자열을 한 번 순회하여 각 문자의 ASCII 값을 구하고, 다시 한 번 순회하여 인접한 값들의 차이를 계산하기 때문에 시간 복잡도가 O(n)입니다. 이는 문자열의 길이에 선형적으로 비례하여 효율적입니다. 또한, 코드가 직관적이어서 이해하기 쉽고, 각 단계가 명확하게 분리되어 있어 유지보수하기도 용이합니다.

이렇게 해서 주어진 문자열의 점수를 효과적으로 계산할 수 있습니다.

관련 문제