Joonas' Note
[코딩으로 풀어보기] 95화 4번, 1~9까지 숫자로 식을 성립시켜라. 본문
- 문제
- 코드
오랜만의 코딩으로 풀어보기 시리즈이다. 오늘은 아주 간단하고 쉬운 문제이다.
문제

1부터 9까지의 숫자를 한번씩만 사용해서, 수식을 성립시키는 문제이다.
이런 유형의 문제는 "복면산 문제"라고 불리는 수학 퍼즐의 한 종류이다.
여담이지만, 개인적으로 좋아하는 문제이다. 이와 관련한 알고리즘 문제를 출제한 적도 있다.
완전 탐색류 알고리즘을 연습하기 좋은 문제라고 생각한다. 아래 링크에서 풀어볼 수 있다.
BOJ 15811 - 복면산?! (https://www.acmicpc.net/problem/15811)
위 문제는 9개의 숫자와 9개의 알파벳이니 더 쉽다.
1부터 9까지 A부터 I까지 모두 대응시켜보며 만들어지는 세 값이 일치하는 지 확인하면 된다.
즉, 모든 순열을 확인하면 된다.
경우의 수는 9!=362,880인데, 이걸 컴퓨터 없이 모두 확인해보기란 무척 어려운 일이다.
문제적 남자에서도 그랬지만, 수식 중 GH ÷ I 부분을 힌트로 삼아야한다.
나머지 두 수식은 곱셈와 뺄셈만 있으니, 항상 정수일 것이다. 그렇다면 GH ÷ I의 결과 역시 정수이여야하므로, GH를 I로 나누어 떨어지게 만드는 수를 생각해보면 후보를 추려진다.
근데 코드는 그런거 없어도 된다 ㅋㅋ (단, 부동소수점만 조심한다면)
코드는 작성하는 데 한 5분 걸린 것 같다.
코드
from itertools import permutations | |
# AB*C = DE-F = GH/I | |
def validate(a): | |
ABC = (10*a[0] + a[1]) * a[2] | |
DEF = (10*a[3] + a[4]) - a[5] | |
if ABC != DEF: | |
return False | |
GH, I = 10*a[6] + a[7], a[8] | |
if GH % I != 0 or ABC != (GH / I): | |
return False | |
return True | |
a = [i for i in range(1, 10)] | |
for p in permutations(a): | |
if validate(p): | |
print(p) | |
for i in range(len(p)): | |
print("{} = {}".format(chr(ord('A') + i), p[i])) | |
위 코드를 실행해보면 (늘 그렇듯이) 답이 하나만 나온다.
A = 3, B = 9, C = 1, D = 4, E = 5, F = 6, G = 7, H = 8, I = 2 이다.
'알고리즘 > 문제 풀이' 카테고리의 다른 글
UVa 136 - Ugly Numbers (2) | 2020.07.06 |
---|---|
BOJ 11012 - Egg (1) | 2020.06.10 |
BOJ 3640 - 제독 (0) | 2020.05.24 |
BOJ 15480 - LCA와 쿼리 (0) | 2020.05.15 |
BOJ 9034 - 순위 (0) | 2020.05.01 |