1 minute read

코딩테스트 연습

1. 해밍 수열

  • 세 소수 p1, p2, p3을 이용해서 해밍 수열 H(p1, p2, p3), i = 1… 을 정의할 수 있다.

  • 해밍 수열 H(p1, p2, p3)은 소인수가 p1, p2, p3로만 이루어진 자연수의 오름 차순 목록이다.

  • 예를 들어, H(2, 3, 5) = 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, … 이고, 5번째 수는 6이다.

입력

  • 첫째 줄에 p1, p2, p3, i가 주어진다. 네 정수는 10^18보다 작다.

출력

  • H(p1, p2, p3)의 i번째 수를 출력한다. 출력하는 수는 10^18보다 작다.

풀이


# your code goes here
 
import sys
 
# 첫째 줄에 p1, p2, p3, i가 주어진다
# 해밍 수열 H(p1, p2, p3)은 소인수가 p1, p2, p3로만 이루어진 자연수의 오름 차순 목록이다.
# H(p1, p2, p3)의 i번째 수를 출력한다. 출력하는 수는 10^18보다 작다.
 
p1, p2, p3, i = list(map(int,sys.stdin.readline().split()))

# p1 ** num1 * p2 ** num2 * p3 ** num3 = 해밍 수열을 이루는 자연수.
# p1, p2, p3을 n번(0 <= n < i) 선택하는 경우의 수와 같다.

h = []

# 계속 최대치에 대한 조건을 달아주어 시간과 메모리를 절약한다.
for num1 in range(0,i+1):
	if p1 ** num1 > 10 ** 18:
		break
	else:
		for num2 in range(0,i+1):
			if p1 ** num1 * p2 ** num2 > 10 ** 18:
				break
			else:
				for num3 in range(0,i+1):
					if p1 ** num1 * p2 ** num2 * p3 ** num3 > 10 ** 18:
						break
					else:
						h.append(p1 ** num1 * p2 ** num2 * p3 ** num3)

 
h.sort()
print(h[i])

풀이 여담

  • p1,p2,p3의 조합이라는 아이디어 도출까지는 좋았으나, 그걸 반복문으로 구현하려해서 메모리 부족, 시간 부족등의 오류로 고생했던 문제.

  • 결국 지저분하지만 모든 반복문에 최대치에 대한 조건을 달아주는것으로 시간 내에 통과할수 있었다.

  • 분명 정렬 문제를 선택했는데 까고보니 경우의 수 문제가 더 많은것 같은 기분이 든다.

채점 결과

  • 정답

  • 다른 상위권 제출자들 역시 while문을 활용한 반복문이라는 차이를 제외하면 비슷했기에 따로 더 나은 해법을 정리하지는 않는다.