[BOJ/1339] 단어 수학, c++

2021. 4. 30. 18:04·DEV/PS

www.acmicpc.net/problem/1339

1339번: 단어 수학

첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대

www.acmicpc.net

github.com/jokj624/PS/blob/master/1000-5000/1339.cpp

jokj624/PS

BOJ, CodeForces 알고리즘 문제 소스코드. Contribute to jokj624/PS development by creating an account on GitHub.

github.com

 한줄 후기 : 그냥 숫자로 더하세요 제발..

 

주어진 알파벳에 숫자를 부여하여 더할 때, 최댓값이 나오도록 해야하는 문제이다.

1회 WA 받고 2회때 맞췄다.

처음에 생각한 방법은 그리디 하게 접근하는데 문자열 길이가 가장 긴 애들순서로 정렬을 시키고 가장 자릿수가 큰 수부터 9부터 부여하는 대신 

ACDEB

    GCF 일때, AC 까지 9-8을 부여한다. 즉 바로 뒤에 있는 문자열길이와의 차 (5-3) 만큼만 부여하고 뒤로 넘어간다.

그 이후 부터는 나머지 자릿수들에 차례대로 남은 수들을 부여하도록 구현했다.

//WA
//BOJ 1339 단어 수학
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
using namespace std;
vector<string> v;
int arr[27];
bool cmp(const string &a, const string &b){
	return a.size() > b.size();
}
int main(){
	int n, num = 9;
	cin >> n;
	for(int i=0; i<n; i++){
		string s;
		cin >> s;
		v.push_back(s);
	}
	sort(v.begin(), v.end(), cmp);
	fill(arr, arr+27, -1);
	for(int i=0; i<n; i++){
		if(i == n-1){
			if(arr[v[i][0]-'A'] == -1){
				arr[v[i][0]-'A'] = num;
				num -= 1;
			}
			break;
		}
		int d = v[i].size() - v[i+1].size();
		for(int j=0; j<d; j++){
			if(arr[v[i][j]-'A'] == -1){
				arr[v[i][j]-'A'] = num;
				num -= 1;
			}
		}
	}
	for(int i=0; i<n; i++){
		for(int j=0; j<v[i].size(); j++){
			if(arr[v[i][j]-'A'] == -1){
				arr[v[i][j]-'A'] = num;
				num -= 1;
			}
		}
	}
	long long N = 0, sum = 0;
	for(int i=0; i<n; i++){
		N = 0;
		for(int j=0; j<v[i].size(); j++){
			N += (arr[v[i][j]-'A'] * pow(10, v[i].size()-(j+1)));
	//		cout << N << endl;
		}
		sum += N;
	}
	cout << sum;
	return 0;
}

 

 

 

이런 식으로 구현했다. 틀렸다!

반례는 (나처럼 틀린 사람이 많았나 보다........)

10
ABB
BB
BB
BB
BB
BB
BB
BB
BB
BB
정답값 : 1790
출력값 : 1780

이다.

즉, 자릿수가 중요한게 아니라 '자릿수의 합'이 중요한 문제다.

전체 자릿수의 합이 큰 알파벳부터 9를 부여하면 된다.

A의 자릿수 합은 100, B의 자릿수 합은 110 이라 B에 9를 부여하고 A에 8을 부여해야 정답이다.

 

//AC
//BOJ 1339 단어 수학
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
using namespace std;
vector<string> v;
map<int, int> m;
int arr[27];
bool cmp(const pair<int,int>& a, const pair<int,int>& b) {
	if (a.second == b.second) return a.first < b.first;
	return a.second > b.second;
}
int main(){
	int n, num = 9;
	cin >> n;
	for(int i=0; i<n; i++){
		string s;
		cin >> s;
		v.push_back(s);
	}
	long long N = 0, sum = 0;
	for(int i=0; i<n; i++){
		for(int j=0; j<v[i].size(); j++){
			m[v[i][j]-'A'] += pow(10, v[i].size()-(j+1));
		}
	}
	vector<pair<int,int>> vec( m.begin(), m.end() );
	sort(vec.begin(), vec.end(), cmp);
	for(int i=0; i<vec.size(); i++){
		arr[vec[i].first] = num;
		num -= 1;
	}
	for(int i=0; i<n; i++){
		N = 0;
		for(int j=0; j<v[i].size(); j++){
			N += (arr[v[i][j]-'A'] * pow(10, v[i].size()-(j+1)));
		}
		sum += N;
	}	
	cout << sum;
	return 0;
}

map을 이용해 구현했다.

map[key(알파벳) index] = 자릿수의합

으로 저장해놓고, 정렬을 통해 자릿수의 합이 큰 알파벳부터 정렬해줬다.

정렬 후, 자릿수의 합이 가장 큰 알파벳 위치부터 9를 부여해주면 된다.

저작자표시 비영리 변경금지 (새창열림)

'DEV > PS' 카테고리의 다른 글

[BOJ/7569] 토마토, c++  (0) 2021.05.06
[BOJ/2467] 용액  (0) 2021.05.02
[BOJ/2116] 주사위 쌓기, c++  (0) 2021.04.23
[BOJ/2623] 음악 프로그램, c++  (0) 2021.04.08
[BOJ/2109] 순회 강연, c++  (0) 2021.04.08
'DEV/PS' 카테고리의 다른 글
  • [BOJ/7569] 토마토, c++
  • [BOJ/2467] 용액
  • [BOJ/2116] 주사위 쌓기, c++
  • [BOJ/2623] 음악 프로그램, c++
jobchae
jobchae
말하는 감자지만, 코드를 끄적이는 Node.js 백엔드 개발자입니다.
  • jobchae
    JOBCHAE
    jobchae
  • 전체
    오늘
    어제
    • 🚀 JOBCHAE (177)
      • DEV (146)
        • PS (108)
        • Node.js (12)
        • React (3)
        • docker (1)
        • 잡다한 개발 일지 (20)
        • injection (1)
        • CI CD (0)
        • JS, TS (1)
      • 축구 (0)
      • 일상 (19)
      • 영화 (3)
      • 음악 (8)
  • 블로그 메뉴

    • 💻 Github
    • 🙋🏻 Linkedin
    • 📖 방명록
  • 링크

    • PS Github
  • 공지사항

  • 인기 글

  • 태그

    DP
    boj
    위상정렬
    우선순위큐
    리액트
    Express
    Nest.js
    nodejs
    백준
    BFS
    PS
    슬랙
    mongoDB
    Nest
    렛츠락페스티벌
    앱잼
    node.js
    일상
    slack
    DFS
    슬랙봇
    aws
    알고리즘
    SOPT
    이분탐색
    GitHub
    회고
    typescript
    react
    솝트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
jobchae
[BOJ/1339] 단어 수학, c++
상단으로

티스토리툴바