본문으로 바로가기
728x90
반응형


[22번 문제]


여기 5천개 이상의 영문 이름들이 들어있는 46KB짜리 텍스트 파일 names.txt names.txt이 있습니다 (우클릭해서 다운로드 받으세요).

이제 각 이름에 대해서 아래와 같은 방법으로 점수를 매기고자 합니다.

  • 먼저 모든 이름을 알파벳 순으로 정렬합니다.
  • 각 이름에 대해서, 그 이름을 이루는 알파벳에 해당하는 숫자(A=1, B=2, ..., Z=26)를 모두 더합니다.
  • 여기에 이 이름의 순번을 곱합니다.

예를 들어 "COLIN"의 경우, 알파벳에 해당하는 숫자는 3, 15, 12, 9, 14이므로 합이 53, 그리고 정렬했을 때 938번째에 오므로 최종 점수는 938 × 53 = 49714가 됩니다.

names.txt에 들어있는 모든 이름의 점수를 계산해서 더하면 얼마입니까?

[ 번역링크 / 원본링크 ]


[코드]


처음엔 string 배열을 정렬하는 코드를 짜다가... 정렬속도가 너무 느려서 1차멘붕..

벡터에서 정렬기능을 지원하는걸 보고 2차 멘붕...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
 
unsigned long long ans = 0;
int main()
{
    vector <string> list;
    ifstream file("names.txt");
    if (file.is_open())
    {
        cout << "파일오픈 성공" << endl;
        string temp;
        while (!file.eof())
        {
            getline(file, temp, ',');
            list.push_back((temp.erase(temp.length() - 11)).erase(01));
        }
        file.close();
        sort(list.begin(), list.end());
 
        int num,i = 1;
        for (auto& v : list)
        {
            num = 0;
            for (int j = 0; j < v.length(); j++)
            {
                if (v[j] >= 'A' && v[j] <= 'Z')
                    num += v[j] - '@';
                else if (v[j] >= 'a' && v[j] <= 'z')
                    num += v[j] - '`';
            }
            ans += num*i;
            i++;
        }
    }
    else
    {
        cout << "파일열기 실패" << endl;
        system("pause");
        exit(1);
    }
    cout << ans << endl;
    system("pause");
    return 0;
}
cs

728x90
반응형