오늘의 문제
https://www.acmicpc.net/problem/1436
포인트 쳌쳌
- while 문으로 1씩 증가시키며 원하는 n번째 숫자를 찾을 때까지 반복한다.
- “666”을 포함해야 한다.
- 숫자 6은 연속으로 존재해야 한다.
- 숫자 순서는 대략 666, 1666, 2666, 3666, 4666, 5666, 6660, 6661, 6662, … 와 같다.
처음 시도했던 코드는 이랬다.
숫자 6이 나오면 그 바로 앞자리도 6인 경우 그 연속된 경우를 카운트하여 답을 찾고자 했다.
n = int(input())
start = 665
result = 0
while n > 0:
cnt = 0
seq = list(str(start)) #숫자 리스트
for i in range(1,len(seq)):
if seq[i] == '6':
if seq[i-1] == seq[i]:
cnt += 1
if cnt >= 2:
result = start
n -= 1
break
start += 1
print(result)
n=1, 2, 10, 14와 같이 비교적 작은 숫자들로 테스트케이스를 확인했을 때는 잘 통과하길래 맞는 줄 알았지만
간과한 것은 연속된 6 세 자리 이상
이다. 위 코드로는 6606
과 같이 연속으로 배열된 숫자가 아니라도 결과값 result에 담겨져버린다.
두번째 시도한 것은 다음 코드이다. 통과는 했지만 시간이 1분 이상 어어어어어어ㅓ어엄청나게 소요됐다.
n = int(input())
start = 665
result = 0
while n > 0:
cnt = 0
seq = list(str(start)) #숫자 리스트
for i in range(1,len(seq)):
if seq[i] == '6':
if seq[i-1] == seq[i]:
cnt += 1
else:
cnt = 0
if cnt >= 2:
result = start
n -= 1
break
start += 1
print(result)
그러다 구글링을 해본 결과 파이썬으로는 대부분 이 코드로 푸신 것 같다.
문장이 훨씬 간결할뿐더러 위 코드보다 시간이 절반 그 이상으로 줄었다!
모두들 굉장해……
n = int(input())
start = 665
while n > 0:
if '666' in str(start):
n -= 1
start += 1
# n번째 까지 답이 구해진 후에
# start += 1문장에 의해 결과값+1이 되므로 -1을 해주어야 한다.
print(start-1)