[코딩테스트C++] 단어수학

후이재·2020년 10월 16일
1

오늘의 문제

단어수학

문제 분석

  • N이 1~10 이고, 문자열 길이가 최대8이므로, 2초라는 시간은 넉넉하다.

나의 풀이

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <math.h>
using namespace std;
 
const int MAX = 10;
vector<string> s(MAX);
int n;
// 단어수학
bool cmp(pair<char, int> a, pair<char, int> b){
    return a.second > b.second;
}
int solution(){
    map<char, int> m;
    for(int i=0;i<n;i++){
        for(int j=0;j<s[i].size();j++){
            if(m.insert(make_pair(s[i].at(j), pow(10, (s[i].size()-j)-1))).second == false){
                m[s[i].at(j)] += pow(10, (s[i].size()-j)-1);
            }
        }
    }
    vector<pair<char, int>> v(m.begin(), m.end());
    sort(v.begin(), v.end(), cmp);
    int answer = 0;
    int number = 9;
    for(int i=0;i<v.size();i++){
        answer += m[v[i].first] * number--;
    }

    return answer;
}

풀이 방법

  • 각 문자가 사용된 자릿수를 합한 결과값에서 제일 큰 합을 가지고있는 알파벳부터 큰 수를 배정해준다.
  • map을 정렬하는 방법을 터득했다. vector를 m.begin, m.end로 생성하여, cmp함수를 이용해 정렬한다.

다른 답안

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int main()
{
	int n, m, i, len;
	int arr[26] = {0};
	char str[9];
	
	scanf("%d", &n);
	
	while(n--)
	{
		scanf("%s", str);

		m = 1;
		len = strlen(str);

		for(i=len-1;i>=0;i--)
		{
			arr[str[i] - 'A'] += m;
			m *= 10;
		}
	}

	sort(arr, arr + 26);
	
	n = 0;
	for(i=0;i<9;i++)
	{
		n += arr[25 - i] * (9 - i);
	}
	
	printf("%d\n", n);
	
	return 0;
}

배울 점

  • 아 굳이 map을 쓸 필요없이 vector에서 idx로 접근하면 되는거였구나. 를 깨달았다. 나는 한참 멀었다.
profile
공부를 위한 벨로그

0개의 댓글