본문 바로가기

IT/Python

[백준] 9575번 행운의 수 [Python]

728x90

주어진 세개의 수열의 원소들의 조합으로 합을 냈을 때 5나 8로만 이루어진 숫자를 만들 때, 그 숫자의 개수를 구하는 문제

 

더보기

문제

한슬이는 5와 8이 행운의 수라고 생각한다. 그래서 한슬이는 각 자리가 5와 8로만 이뤄져 있는 수를 행운의 수라고 한다.

정수 수열 A, B, C가 주어졌을 때 세 수열에서 각각 하나의 정수를 골라서 만들 수 있는 서로 다른 행운의 수의 개수를 구해보자.

예를 들어 A = [1, 10, 100], B = [3, 53], C = [4, 54]라고 한다면, 행운의 수를 만드는 방법은 8 = 1 + 3 + 4, 58 = 1 + 3 + 54, 58 = 1 + 53 + 4와 같이 총 3가지가 있다. 58은 2가지 방법으로 만들 수 있으니, 서로 다른 행운의 수의 개수는 8과 58, 총 2개이다.

입력

첫째 줄에 테스트 케이스의 수가 주어진다.

각 테스트 케이스의 첫째 줄에 A의 크기 N이 주어지고, 둘째 줄에 수열 A의 원소가 주어진다. 수열 A의 원소는 공백으로 구분되어 있다.

다음 셋째 줄에는 B의 크기 M, 넷째 줄에는 수열 B의 원소, 다섯째 줄에는 C의 크기 K, 여섯째 줄에는 C의 원소가 주어지며, 수열 A의 정보와 같은 형식으로 되어 있다.

수열의 크기는 50을 넘지 않는 양의 정수이고, 수열의 원소는 30,000보다 작거나 같은 양의 정수이다.

출력

각각의 테스트 케이스마다 입력으로 주어진 수열을 이용해 만들 수 있는 서로 다른 행운의 수의 개수를 한 줄에 하나씩 출력한다.

 

9575번: 행운의 수 $($acmicpc.net$)$

 

집합으로 5와 8로만 이루어진 수인지 확인하는 방법

import sys
    
def f():
    # 5, 8로 이루어진 숫자를 저장할 집합
    r = set()
    
    sys.stdin.readline()
    A = set(map(int, sys.stdin.readline().strip().split()))
    sys.stdin.readline()
    B = set(map(int, sys.stdin.readline().strip().split()))
    sys.stdin.readline()
    C = set(map(int, sys.stdin.readline().strip().split()))
    
    for a in A:
        for b in B:
            for c in C:
            
            	# 세 수의 합을 문자열로 변환 -> 자릿수를 정수로 변환 
                # -> 집합에 저장(중복 제거)
                s = set(map(int,str(a+b+c)))
                
                # {5, 8}과 합집합이 {5, 8}이면 s = {5}, {8} 또는 {5, 8}이다.
                if s | {5, 8} == {5, 8}:
                    r.add(a+b+c)
                    
    # 그냥 len(r)을 반환해도 상관 없음
    return str(len(r))

# 데스트 케이스 수 만큼 반복
T = int(sys.stdin.readline())
for _ in range(T):
    # 그냥 print(f())해도 상관 없음
    sys.stdout.write(f()+"\n")

 

10으로 나눈 나머지로 확인하는 방법

import sys

def g(n):
    while n:
        if n%10 not in (5,8):
            return False
        n //= 10
    return True
    
def f():
    r = set()
    sys.stdin.readline()
    A = set(map(int, sys.stdin.readline().split()))
    sys.stdin.readline()
    B = set(map(int, sys.stdin.readline().split()))
    sys.stdin.readline()
    C = set(map(int, sys.stdin.readline().split()))
    for a in A:
        for b in B:
            for c in C:
                if g(a+b+c):
                    r.add(a+b+c)
    return str(len(r))

T = int(sys.stdin.readline())
for _ in range(T):
    print(f())

 

더보기

예제 입력 1 

2
6
100 1 10 100 1 1
7
3 53 53 53 53 53 53
6
4 54 4 54 4 54
1
47
1
500
1
33

예제 출력 1 

2
0