[백준] 1132번 합 (C++)

2026. 3. 15. 13:56·Algorithm
728x90

https://www.acmicpc.net/problem/1132

 

 

이 문제는 N개의 수가 주어지고 N개의 알파벳이 주어질때 각 알파벳에 0부터 9까지 사상시켜 최댓값을 만들어야 하는 문제이다.

 

처음엔 모든 경우의 수를 다 찾는 방법밖에는 없다고 생각하여 주어진 알파벳들을 백트래킹을 사용하여 다 탐색하여 최댓값을 리턴하는 방식을 사용했지만 N이 최대 50이며 알파벳이 10개가 입력된다고 가정했을때 

 

시간복잡도는 O(10! * N)으로 1억을 가뿐히 넘긴다.

 

따라서 다른 방법으로 접근해야 하는데 결국 알파벳의 각 자리수가 존재하기 때문에 이를 이용해서 그리디하게 풀어보았다.

 

먼저 첫번째 테케 ABC, BCA의 예시를 보자

A는 100의 자리 1의 자리가 존재하여 총 101이다 B는 10의 자리 100의 자리가 존재하여 110이다 마지막으로 C는 1의 자리 10의 자리가 존재하여 11이므로 이 값들을 정렬했을때 110, 101, 10이 된다. 즉 B의 값에 가장 큰 9, 이후 A의 값에 8, C의 값에 7을 넣으면 가장 큰 숫자를 얻을 수 있는걸 알 수 있다.

 

따라서 각 알파벳의 값이 모두 존재하는 경우 이는 0을 넣을 가장 작은 곳을 찾아야하기 때문에 가장 작은 것의 인덱스를 찾아 0으로 만들어 정렬후 순차적으로 9부터 1까지 값을 곱하여 더해주었다.

 

정답코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"
#define MAX 1e13

int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int N;
int64_t alpha[10];
bool zero[10];

void Print() {
    for(int i = 0; i < 10; i++) {
        cout << alpha[i] << " ";
    }
    cout << endl;

    for(int i = 0; i < 10; i++) {
        cout << zero[i] << " ";
    }
    cout << endl;
}

void solve() {
    bool flag = false;
    for(int i = 0; i < 10; i++) {
        if(!alpha[i]) {
            flag = true;
        }
    }

    if(!flag) {     //      이미 알파벳이 다 채워져 0을 
        int64_t tmp = MAX;
        int idx = 0;

        for(int i = 0; i < 10; i++) {
            if(!zero[i] && tmp > alpha[i]) {
                tmp = alpha[i];
                idx = i;
            }
        }
        alpha[idx] = 0;
    }

    sort(alpha, alpha+10, [&](int64_t a, int64_t b) {
        return a > b;
    });

    int64_t answer = 0;
    for(int i = 0, j = 9; i < 10; i++, j--) {
        answer += alpha[i] * j;
    }

    cout << answer;
}

void input() {
    cin >> N;

    for(int i = 0; i < N; i++) {
        int64_t cnt = 1;
        string s;

        cin >> s;

        zero[s[0] - 'A'] = 1;

        for(int j = s.size()-1; j >= 0; j--) {
            int idx = s[j] - 'A';
            alpha[idx] += cnt;
            cnt *= 10;
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
    solve();
}

 

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[Algorithm] 이분매칭(Bipartite Matching)  (0) 2026.06.23
[LeetCode] Binary Lifiting를 사용한 최소공통조상 최적화  (0) 2026.06.14
[백준] 14464번 소가 길을 건너간 이유 4  (0) 2026.02.05
[백준] 9489번 사촌 (C++)  (0) 2026.01.04
[백준] 17835번 면접보는 승범이네 (C++)  (0) 2026.01.03
'Algorithm' 카테고리의 다른 글
  • [Algorithm] 이분매칭(Bipartite Matching)
  • [LeetCode] Binary Lifiting를 사용한 최소공통조상 최적화
  • [백준] 14464번 소가 길을 건너간 이유 4
  • [백준] 9489번 사촌 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (278)
      • Programming (47)
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (3)
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (1)
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (5)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백트래킹
    DFS
    정렬
    Bandit
    재귀
    깊이우선탐색
    비트마스킹
    코딩
    시뮬레이션
    구현
    linux
    그래프 이론
    트리
    이분탐색
    Leviathan
    WebSecurity
    우선순위 큐
    투포인터
    브루트포스
    에라토스테네스의 체
    다익스트라
    wargame
    누적합
    DP
    BFS
    우선순위큐
    c언어
    다이나믹 프로그래밍
    백준
    그리디
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 1132번 합 (C++)
상단으로

티스토리툴바