문제
대구소프트웨어마이스터고등학교에 다니고 있는 changwook987은 베르나르 베르베르의 소설 『개미』를 읽다가 흥미로운 수열을 보았다.
1,11,12,1121 ...
이 수열은 소설 『개미』에서 나와 개미 수열이라고 부르기도 하고 읽고 말하기 수열이라고 하기도 한다.
이 수열의 규칙은 이렇다.
- 첫 번째 항은 1이다.
- 이전 항의 이웃한 같은 숫자들을 묶는다.
- 이전 항이 1121일 경우 (1,1), (2), (1)
- 묶인 숫자들의 숫자와 개수를 붙여 쓴다.
- 묶인 숫자들이 (1,1), (2), (1) 일경우 122111이 된다.
- 2, 3을 반복한다.
이 개미 수열을 관찰하다 보면 수가 빠르게 길어지지만, 수를 이루는 숫자가 커지기는 쉽지 않다는 것을 알 수 있다.
그렇다면 이 수열의 번째 항의 자릿수 중에서 가장 큰 수는 무엇일까?
개미 수열의 번째 항의 자릿수 중 가장 큰 수를 출력해 보자.
입력
첫째 줄에 양의 정수 이 주어진다. (1≤𝑁≤100)
출력
개미 수열의 번째 항의 자릿수 중에서 가장 큰 수를 출력한다.
예제 입력 1 복사
1
예제 출력 1 복사
1
예제 입력 2 복사
2
예제 출력 2 복사
1
# 백준/실버5/개미 수열
N = int(input())
if N == 1 or N==2:
print(1)
elif N == 3 or N == 4 or N == 5:
print(2)
else:
print(3)
신기한 문제였다.
일반 구현 문제인줄 알고 풀다가 시간초과로 풀리지가 않아 다른 사람들의 풀이를 검색했더니..
문제 조건에 N번째항의 자릿수 즉, 반복된 횟수가 아닌 숫자 자체의 최댓값을 구하는 문제였다.
근데 n이 6 이상이면 3을 넘지 못한다는 것이 문제의 포인트였다.
결국 저런 코드가 나오게 된다..
구현으로 푼것도 아까워서 일단 남긴다.
# 백준/실버5/개미 수열
import collections
N = int(input())
ant = "1"
if N == 1:
print(1)
else:
for _ in range(N-2):
new_ant = ""
cnt = 1
prev = ""
for i in range(0,len(ant)):
if ant[i] == prev:
cnt += 1
elif ant[i] != prev and i!=0:
new_ant += prev + str(cnt)
cnt = 1
prev = ant[i]
new_ant += prev + str(cnt)
ant = new_ant
print(max(list(ant)))
나는 이전항을 활용했었다. 다음 항은 이전 항의 숫자 + 횟수 이기 때문에 이전 항의 숫자의 최대값이 곧 문제에서 원하는 최대값이 된다.
'알고리즘 > 백준' 카테고리의 다른 글
백준 1268 - 임시 반장 정하기 (0) | 2024.05.21 |
---|---|
백준 2870 - 수학숙제 (0) | 2024.05.20 |
백준 11070 - 피타고라스 기댓값 (0) | 2024.05.18 |
백준 23899 - 알고리즘 수업 - 선택 정렬 5 (0) | 2024.05.17 |
백준 1274 - 부호 (0) | 2024.05.16 |