https://www.acmicpc.net/problem/1339
1339번: 단어 수학
첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대
www.acmicpc.net
걸린 시간 : 17분 46초
아이디어
- 입력을 받으면서 알파벳들의 가중치를 설정해준다. ABC 가 들어오면 A의 가중치에 100, B의 가중치에 10, C의 가중치에 1을 추가해주는 식이다.
- 입력이 끝나면 가중치가 큰 알파벳 순으로 9부터 내려가면서 할당한다.
끝이다.... 어렵지는 않은 문제
Map을 Value 기준으로 정렬
여기서 가중치를 map으로 구현하는데, map은 key를 기준으로 정렬할 수 있다. 하지만 이 문제와 같이 value로 정렬해야 할 수 있다. C++에서는 이를 바로 정렬할 수는 없고, vector로 옮겨서 정렬하는 식으로 구현해야 한다. 코드는 다음과 같다.
vector<pair<char, int> > v(m.begin(), m.end()); sort(v.begin(), v.end(), cmp);
맵의 요소를 pair로 바꿔 그대로 vector에 복사한다. 이것을 cmp 함수를 기준으로 정렬한다. value는 second 값이므로 value를 기준으로 내림차순 정렬하고 싶으면 다음과 같은 cmp함수를 구현한다.
bool cmp(const pair<char, int>& a, const pair<char, int>& b) { return a.second > b.second; }
정답 코드
#include <bits/stdc++.h> using namespace std; map<char, int> weight; int N, ans, val = 9; bool cmp(const pair<char, int>& a, const pair<char, int>& b) { return a.second > b.second; } int main(void) { ios::sync_with_stdio(0); cin.tie(0); cin >> N; for (int i = 0; i < N; i++) { string word; cin >> word; for (int j = 0; j < word.size(); j++) { weight[word[j]] += pow(10, word.size()-j-1); } } vector<pair<char, int> > v(weight.begin(), weight.end()); sort(v.begin(), v.end(), cmp); for (auto p : v) { ans += p.second * val; val--; } cout << ans; return 0; }
'Baekjoon Online Judge' 카테고리의 다른 글
[BOJ] 2636 : 치즈 (C++) (1) | 2023.09.07 |
---|---|
[BOJ] 2110 : 공유기 설치 (C++) (0) | 2023.09.05 |
[BOJ] 3055 : 탈출 (C++) (0) | 2023.08.30 |
[BOJ] 1600 : 말이 되고픈 원숭이 (C++) with BFS (0) | 2023.08.29 |
[BOJ] 2140: 지뢰찾기 (C++) (0) | 2023.08.29 |