1436 영화감독 숌
종말의 숫자란 어떤 수에 6이 적어도 3개이상 연속으로 들어가는 수를 말한다. 제일 작은 종말의 숫자는 666이고, 그 다음으로 큰 수는 1666, 2666, 3666, .... 과 같다.
따라서, 숌은 첫 번째 영화의 제목은 세상의 종말 666, 두 번째 영화의 제목은 세상의 종말 1666 이렇게 이름을 지을 것이다. 일반화해서 생각하면, N번째 영화의 제목은 세상의 종말 (N번째로 작은 종말의 숫자) 와 같다.
숌이 만든 N번째 영화의 제목에 들어간 숫자를 출력하는 프로그램을 작성하시오.
# 영화감독 숌
n = int(input())
triple_six = 666 # '666'이 들어간 값을 찾을 때 '666'을 기본값(제일 작은 값)으로 설정하여 탐색한다.
cnt = 0 # '666'이 포함된 값을 찾을 때 마다 cnt를 1씩 더해준다.
# 1-10000 중 '666'이 포함된 값에 번호를 매기는 역할
while True:
if '666' in str(triple_six): # 만약 '666'의 값을 찾았을 때
cnt += 1 # 번호를 매긴다
if cnt == n: # 입력값 n과 같을 때
print(triple_six) # '666'이 포함된 n번째 값을 출력한다.
break
triple_six += 1 # 조건문이 성립되지 않는다면 666에 1씩 더하여 '666'이 포함된 값을 찾는다.
'666'이 들어간 N번째의 값을 찾는다.
N이 1이라면 출력값은 666이며 다음 값들은 1666, 2666, 3666 ... 이다.
즉, 1부터 10,000까지 '666'이 들어간 정수에 번호를 매기는 것이다.
5666 다음 값은 6666이 아닌 6660이 된다.
이러한 문제 조건으로 단순히 '666'에 1부터 N까지의 값을 '1666'처럼 붙여선 안된다.
변수 triple_six에 666 값을 넣어서 기본값을 설정한다.
cnt는 1부터 10,000까지 정수들 중 '666'을 찾게되면 1씩 더해진다. 즉, cnt는 '666'이 포함된 정수들의 번호를 매기는 역할이다.
while True:
if '666' in str(triple_six): # 만약 '666'의 값을 찾았을 때
cnt += 1 # 번호를 매긴다
첫 조건문에서 기본값으로 설정한 triple_six의 '666'이 조건에 성립되어 cnt가 1이 된다.
즉, 666이 첫 번째가 되는 것이다.
if cnt == n: # 입력값 n과 같을 때
print(triple_six) # '666'이 포함된 n번째 값을 출력한다.
break
triple_six += 1 # 조건문이 성립되지 않는다면 666에 1씩 더하여 '666'이 포함된 값을 찾는다.
N번째의 값을 찾는 입력값 n과 cnt('666' 포함 순서 번호)가 같다면
해당하는 '666' 포함 값을 출력한다.
위 조건문들이 모두 성립되지 않는다면 '666'에 1씩 더해주며 '666'이 포함된 값을 탐색한다.
2309 일곱난쟁이
아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다. 일곱 난쟁이의 키의 합이 100이다.
# 일곱 난쟁이
dwarfs = [] # 난쟁이의 키를 저장할 리스트 변수
for x in range(9): # 9번의 난쟁이 키 값을 받는다.
input_ = int(input())
dwarfs.append(input_) # 난쟁이의 키 값을 리스트에 하나씩 넣어준다.
sum_ = sum(dwarfs) # 리스트에 저장된 9명의 난쟁이 키를 모두 합산한다.
for i in range(9): # 전체 9명의 난쟁이를 순회한다.
for j in range(i + 1, 9): # 2명의 난쟁이를 빼주기 위한 탐색
if sum_ - (dwarfs[i] + dwarfs[j]) == 100: # 만약 9난쟁이를 모두 더한 값에 2명의 난쟁이 키 값을 뺀 값이 100이라면
not_d1 = dwarfs[i] # 7 난쟁이에서 제외된 2명의 난쟁이 변수에 저장한다.
not_d2 = dwarfs[j]
dwarfs.remove(not_d1) # 제외할 2명의 난쟁이 키 값을 리스트에서 제거한다.
dwarfs.remove(not_d2)
dwarfs = sorted(dwarfs) # 오름차순으로 정리한다.
for k in dwarfs: # 리스트에 있는 7난쟁이의 키 값을 하나씩 출력한다.
print(int(k))
7명의 난쟁이들을 찾기 위해 9명에서 2명의 키를 빼는 방식으로 접근한다.
9명의 난쟁이들의 키 값을 넣어줄 dwarfs 변수를 리스트 형태로 만들어 입력값을 차례대로 넣어준다.
리스트에 넣어준 값들을 sum() 함수로 더해준다.
for i in range(9): # 전체 9명의 난쟁이를 순회한다.
for j in range(i + 1, 9): # 2명의 난쟁이를 빼주기 위한 탐색
if sum_ - (dwarfs[i] + dwarfs[j]) == 100: # 만약 9난쟁이를 모두 더한 값에 2명의 난쟁이 키 값을 뺀 값이 100이라면
not_d1 = dwarfs[i] # 7 난쟁이에서 제외된 2명의 난쟁이 변수에 저장한다.
not_d2 = dwarfs[j]
첫 번째 for문에서 9명의 키를 모두 순회한다.
두 번째 for문에서 i값의 다음 값부터 끝까지 순회하여 제거할 2명의 난쟁이를 찾는다.
조건문을 통해 9명 전체의 값에서 2명의 키를 뺀 값이 100과 같다면,
해당되는 2명의 키 값을 각자의 변수 not_d1, not_d2에 넣어준다.
dwarfs.remove(not_d1) # 제외할 2명의 난쟁이 키 값을 리스트에서 제거한다.
dwarfs.remove(not_d2)
dwarfs = sorted(dwarfs) # 오름차순으로 정리한다.
해당 값을 9명 값이 모두 포함되어 있는 리스트에서 제외한다.
오름차순으로 정렬한 후 출력한다.
2798 블랙잭
# 블랙잭
n, m = map(int,input().split())
cards = list(map(int,input().split())) # 카드의 값을 리스트로 받는다.
max_total = 0 # m에 가까운 최대치 값을 저장하기 위한 변수
for i in range(n - 2):
for j in range(i + 1, n -1):
for k in range(j + 1, n):
total = cards[i] + cards[j] + cards[k]
if max_total < total <= m: # 합산값이 이전 최대치보다 크거나 m(목표치)에 가까운 값이라면
max_total = total # 최대치 값이 된다.
if total == m: # m(목표치)와 같다면
max_total = total # 최대치로 저장한다.
break
print(max_total)
'Algorithm' 카테고리의 다른 글
백준 2606, 11724 (0) | 2022.08.10 |
---|---|
그래프(무방향, 유방향) 예문 (0) | 2022.08.09 |
[이론] 이차원 리스트 (0) | 2022.08.06 |
[이론] 힙 Heap, 셋 Set (0) | 2022.08.06 |
[이론] 스택 Stack, 큐 Queue (0) | 2022.08.06 |