morijwana
수로그
morijwana
전체 방문자
오늘
어제
  • 분류 전체보기
    • 강의노트
    • Machine Learning
      • Pandas
      • NLP
    • Computer Science
      • Linux
      • TIL
    • Development
      • React
      • Swift
      • Javascript
    • 스터디 기록
      • Clean Code
      • 구글 BERT의 정석
      • 개발도서
      • 기타
    • Problem Solving
      • Baekjoon
      • ICPC Sinchon
    • 끄적
      • 끄적끄적
      • 요리왕

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 개발도서
  • ML
  • Bert
  • 민트하임스터디
  • 자연어처리
  • Pandas
  • word2vec
  • 백준
  • 프로그래밍언어론
  • cs224n
  • 회고
  • 구글BERT의정석
  • nlp
  • Solution Challenge
  • gdsc
  • 프레임워크없는프론트엔드개발
  • Python
  • 구부정스터디
  • 데이터사이언스
  • GDSC Sookmyung

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
morijwana

수로그

Problem Solving/ICPC Sinchon

백준 15811번 - 복면산!?(Python)

2020. 7. 19. 01:24

초급 스터디 - 01.5 Permutation and Combination 연습문제 F

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

 

15811번: 복면산?!

복면산이란 수학 퍼즐의 일종으로, 어떤 계산식의 각 숫자들을 특정 문자로 바꾸면 각 문자가 어떤 숫자인지 맞추는 퍼즐이다. 대표적으로 SEND+MORE=MONEY가 있다. SEND + MORE ------ MONEY S=9, E=5, N=6, D=7,

www.acmicpc.net

문제

복면산 문제인데, 파이썬의 itertools 라이브러리를 잘 사용하면 쉽게 풀 수 있을 것 같았다.

 

코드 설명

우선 첫 번째 단어와 두 번째 단어, 그리고 정답 단어를 각각 op1, op2, ans로 입력받은 다음, 집합으로 변형시켜 중복을 없애주고 다시 정렬된 리스트로 형식 변환을 시켜주었다. 따라서 alphaList에는 입력받은 알파벳이 중복 없이 정렬되어 있는 상태로 저장되어 있다.

각 알파벳과 대응하는 수열을 얻기 위해 itertools.permutation 메소드를 사용해서 0부터 9까지의 수에서 식에 포함된 알파벳의 개수만큼 수를 뽑아 순열을 만들었다. 또한 딕셔너리를 이용해 key(알파벳)과 value(숫자)의 값을 쉽게 매칭할 수 있도록 했다.

28~36번째 줄의 반복문은 순열을 생성한 다음

  1. 알파벳의 개수가 10보다 큰지 확인한다. 10보다 크면 0~9까지의 수로 모든 알파벳을 커버할 수 없기 때문이다.
  2. 알파벳의 개수가 10보다 작다면 알파벳의 개수만큼 반복문을 실행하여 각 알파벳과 k에 저장된 순열의 숫자가 인덱스 번호대로 매치하도록 저장했다.
  3. solve() 메소드를 실행시킨다. solve()는 op1, op2, ans 각각에 들어있는 알파벳과 대응하는 숫자를 가져와 정수로 변환한 다음, op1 + op2 == ans의 결과를 bool type로 반환하는 함수이다. int(op1)와 같이 변환하는 방법도 있지만, 시간복잡도를 고려했을 때 solve()에서처럼 직접 자릿수를 곱하여 계산하는 게 더 빠르다고 한다.

 

나의 코드

from itertools import permutations
import sys


nums = [x for x in range(10)]
op1, op2, ans = map(list, sys.stdin.readline().split())


def solve():
    fir = sec = thi = 0
    for i in op1:
        fir *= 10
        fir += alnumDict[i]
    for i in op2:
        sec *= 10
        sec += alnumDict[i]
    for i in ans:
        thi *= 10
        thi += alnumDict[i]
    return thi == fir + sec


alphaList = sorted(list(set(op1 + op2 + ans)))

alnumDict = {}
alphaLength = len(alphaList)

for k in permutations(nums, alphaLength):
    if alphaLength > 10:
        break
    for i in range(alphaLength):
        alnumDict[alphaList[i]] = k[i]

    if solve():
        print("YES")
        exit(0)

print("NO")

 

저작자표시 (새창열림)

'Problem Solving > ICPC Sinchon' 카테고리의 다른 글

백준 11582번 - 치킨 TOP N(C++)  (1) 2020.07.29
백준 10825번 - 국영수(C++, Python - lambda)  (0) 2020.07.29
백준 1248번 - 맞춰봐(Python)  (0) 2020.07.22
    'Problem Solving/ICPC Sinchon' 카테고리의 다른 글
    • 백준 11582번 - 치킨 TOP N(C++)
    • 백준 10825번 - 국영수(C++, Python - lambda)
    • 백준 1248번 - 맞춰봐(Python)
    morijwana
    morijwana
    행복한 휴학생의 devlog

    티스토리툴바