Programming/ACMICPC

ACMICPC 9575 운 좋은 수

Lazy Ren 2015. 10. 3. 23:00

문제

한슬이는 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 세 가지가 있다. 

(하지만, 58은 서로 같은 수 이므로 1개로 간주한다.)

입력

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

각 케이스의 첫째 줄에 a의 원소의 개수 k (1 ≤ k ≤ 50)이 주어진다.

다음 줄에 a의 원소 k개가 공백 하나로 구분되어 주어진다.

다음 줄에 b의 원소의 개수 l (1 ≤ l ≤ 50)이 주어진다.

다음 줄에 b의 원소 l개가 공백 하나로 구분되어 주어진다.

다음 줄에 c의 원소의 개수 m (1 ≤ m ≤ 50)이 주어진다.

다음 줄에 c의 원소 m개가 공백 하나로 구분되어 주어진다.

a, b, c의 원소는 모두 1 이상 30,000이하의 정수이다.

출력

각 줄에 행운의 수의 개수를 출력한다.


문제 풀이에 list(), set() 함수들을 유용하게 써먹었다.


예제 입력에 나오듯이 a, b, c 원소들에 중복이 많은데 이를

list(set([중복 제거를 원하는 리스트 원소들])) 을 통해 중복을 제거해주었다.

set은 문자 그대로 집합을 나타내는 파이썬 데이터 타입으로,

순서가 없고(unordered), 중복을 허용하지 않는다고 한다.

순서가 없기때문에 인덱싱이 불가능하니, 다시 list형으로 바꿔줘야 한다!


입력 값 받은 후에는 뭐.. 그냥 brute-force 로 계산해도 최대 계산량이

50*50*50 이길래 때려 박았다.

계산해서 나온 값 숫자 중 하나라도 5,8이 아니면 제외시켜주고

채를 통과한 친구만 luckyNum에 넣어주면 된다.

마지막에 luckyNum도 중복을 제거해주어야 한다.