본문 바로가기

Algorithm/Brute Force

(C++) - 백준(BOJ) 13140번 : Hello World!

반응형

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

 

13140번: Hello World!

N이 주어질 때 hello + world = N을 만족하는 서로 다른 한 자리 자연수(0 포함) d, e, h, l, o, r, w를 구해서 아래 그림과 같은 형태로 출력하는 프로그램을 작성하여라. 단, h와 w는 0이 될 수 없다.

www.acmicpc.net

brute force 문제였습니다.

 

📕 풀이방법

📔 입력 및 초기화

 덧셈 결과를 입력받을 result를 선언 후 입력받습니다. 조회를 빠르게 하기 위해 unordered_map을 사용했습니다. 순열을 돌 일차원 배열 nums를 선언합니다.

 

📔 풀이과정

 "helowrd"에 대해 임의의 수를 부여합니다. 10개 (0 ~ 9)의 숫자에서 순서 상관있게 7개를 뽑는 것과 같습니다. 

 

 1. nums에 대해 next_permutation을 수행하며 가장 왼쪽부터 7개의 수를 뽑아 내어 unordered_map에 정보를 갱신해줍니다. 'h', 'w'는 0이 될 수 없으므로 이런경우엔 continue해줍니다.

 

 2. 뽑아낸 수 정보를 통해 a, b에 5자리의 수를 저장합니다.

 

 3. a + b == result라면 답을 찾아낸 것이므로 적절히 출력합니다. 이때 result를 출력 시 공백에 주의합니다.

 


📕 Code

#include <bits/stdc++.h>
using namespace std;
int result, nums[10], flag;
string word = "helowrd";
unordered_map <char, int> m;

int main(){
    cin >> result;
    for(int i = 0; i < 10; i++) nums[i] = i;

    do{
        for(int i = 0; i < word.size(); i++) m[word[i]] = nums[i];

        if(m['h'] == 0 || m['w'] == 0) continue;

        int a = m['h'] * 10000 + m['e'] * 1000 + m['l'] * 100 + m['l'] * 10 + m['o'];
        int b = m['w'] * 10000 + m['o'] * 1000 + m['r'] * 100 + m['l'] * 10 + m['d'];

        if(a + b == result){
            int as = to_string(a).size();
            int bs = to_string(b).size();
            cout << "  " << a << '\n';
            cout << "+ " << b << '\n';
            cout << "-------\n";
            for(int i = 0; i < 7 - to_string(result).size(); i++) cout << ' ';
            cout << result << '\n';
            flag = 1;
            break;
        }

    } while(next_permutation(nums, nums + 10));
    
    if(!flag) cout << "No Answer";
}

📕 Test Case

input 

183128