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() - 1, 1)).erase(0, 1)); } 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
반응형
'Solution > Project Euler' 카테고리의 다른 글
[24/C++] 0, 1, 2, 3, 4, 5, 6, 7, 8, 9로 만들 수 있는 1,000,000번째 사전식 순열은? (0) | 2018.05.28 |
---|---|
[23/C++] 두 초과수의 합으로 나타낼 수 없는 모든 양의 정수의 합은? (0) | 2018.05.28 |
[21/C++] 10000 이하 모든 친화수(우애수)의 합은? (0) | 2018.05.26 |
[20/C++] 100! 의 자리수를 모두 더하면? (0) | 2018.05.26 |
[19/C++] 20세기에서, 매월 1일이 일요일인 경우는 몇 번? (0) | 2018.05.26 |