문제 개요
이 문제에서는 문자열 배열 str[]이 주어지며, 배열에 포함된 모든 문자열의 점수(score)를 구하는 것이 목표입니다. 점수는 다음과 같이 정의됩니다.
점수 = 문자열의 위치(순번) × 문자열을 구성하는 각 문자의 알파벳 값(a=1, b=2, …, z=26)의 합
예시로 문제 이해하기
입력
str[] = {"Learn", "programming", "tutorials", "point"}풀이 과정
"Learn"은 1번째 위치 →
합계 = 12 + 5 + 1 + 18 + 14 = 50
점수 = 50 × 1 = 50
"programming"은 2번째 위치 →
합계 = 16 + 18 + 15 + 7 + 18 + 1 + 13 + 13 + 9 + 14 + 7 = 131
점수 = 131 × 2 = 262
"tutorials"는 3번째 위치 →
합계 = 20 + 21 + 20 + 15 + 18 + 9 + 1 + 12 + 19 = 135
점수 = 135 × 3 = 405
"point"는 4번째 위치 →
합계 = 16 + 15 + 9 + 14 + 20 = 74
점수 = 74 × 4 = 296
접근 방법
이 문제는 아주 단순한 방법으로 해결할 수 있습니다. 배열의 모든 문자열을 순회하면서 각 문자열에 대해 다음 작업을 수행하면 됩니다.
- 문자열의 위치(인덱스)를 저장합니다.
- 문자열을 구성하는 각 문자의 알파벳 값을 모두 더합니다.
- 위치와 합계를 곱한 값을 결과로 반환합니다.
알고리즘
1단계 – 문자열 배열을 순회하면서 각 문자열의 위치를 저장하고, 각 문자열마다 2단계와 3단계를 수행합니다.
2단계 – 해당 문자열의 알파벳 값 합계를 계산합니다.
3단계 – 위치와 합계를 곱한 최종 점수를 출력합니다.
C++ 구현 예시
위 풀이 방식의 동작을 보여주는 프로그램입니다.
#include <iostream>
using namespace std;
int strScore(string str[], string s, int n, int index){
int score = 0;
for (int j = 0; j < s.length(); j++)
score += s[j] - 'a' + 1; // 각 문자를 알파벳 값(a=1)으로 변환해 누적
score *= index; // 위치(index)를 곱해 최종 점수 계산
return score;
}
int main(){
string str[] = { "learn", "programming", "tutorials", "point" };
int n = sizeof(str) / sizeof(str[0]);
string s = str[0];
for(int i = 0; i<n; i++){
s = str[i];
cout<<"The score of string ' "<<str[i]<<" ' is "<<strScore(str, s, n, i+1)<<endl;
}
return 0;
}
실행 결과
The score of string ' learn ' is 50
The score of string ' programming ' is 262
The score of string ' tutorials ' is 405
The score of string ' point ' is 296
코드 설명 및 복잡도 분석
핵심 함수인 strScore()는 문자열의 각 문자를 순회하면서 s[j] - 'a' + 1 연산을 통해 문자를 알파벳 순번 값으로 변환합니다. 예를 들어 'a'는 1, 'b'는 2처럼 변환되며, 이 값들을 모두 누적한 뒤 문자열의 위치(index)를 곱해 최종 점수를 반환합니다.
시간 복잡도는 문자열의 개수를 N, 평균 길이를 L이라 할 때 O(N × L)이며, 추가 메모리 사용이 거의 없어 공간 복잡도는 O(1)입니다. 따라서 입력 크기가 커져도 효율적으로 동작하는 간단하고 실용적인 풀이입니다.