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

2023. 1. 21. 03:42알고리즘/브루트포스

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

풀이

오늘 순열로 현타오게 만든 문제.

 

완전 탐색인건 알고 접근했으나 무지성 for 문과 if 문을 남발하던 도중 이건 아니다 싶어서 찾아봤다.

순열로 너무 간단하게 풀리는 것을 보고 조금 충격이었다.

 

unordered_map을 이용해 helowrd에 해당하는 value를 계속 변경하는 방법이다.

순열로 변경하기 때문에 모든 조건을 탐색할 수 있다.

 

unordered_map을 이용하니 가독성도 너무 좋아졌다. (내가 한건 아니지만)

 

결론 - unordered_map, next_permutation 짱짱맨, 자주쓰자

 

전체 코드

#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <string>

using namespace std;

int N;
unordered_map <char, int> m;
string word = "helowrd";
int num[10];
int a, b;

void print_result() {
	cout << "  " << a << '\n';
	cout << "+ " << b << '\n';
	cout << "-------\n";
	for (int i = 0; i < 7 - to_string(N).size(); i++) cout << ' ';
	cout << N << '\n';
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	cin >> N;
	for (int i = 0; i < 10; i++) num[i] = i;

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

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

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

		if (N == a + b) {
			print_result();
			return 0;
		}

	} while (next_permutation(num, num + 10));

	cout << "No Answer";
}

 

참고사이트 - https://codecollector.tistory.com/1206