Part One
일련의 알파벳들로 구성된 엄청 긴 한 줄의 string자료를 앞에서부터 네 개 씩 묶어보며,
그 네 개의 알파벳들 중 겹치는 알파벳이 존재하는 지 (예: ['a', 'b', 'b', 'c']) 확인하고
모든 알파벳이 다르게 구성되어있는(예: ['a', 'b', 'c', 'd']) 가장 첫 번째 지점의 "인덱스+1" 를 구하는 문제이다.
file = open("input/day6.txt", "r")
letters_data = file.read()
check = []
# 1
for i in range(4):
check.append(letters_data[i])
# 2
for j in range(len(letters_data) - 4):
if len(set(check)) != 4:
del check[0]
check.append(letters_data[3 + j])
elif len(set(check)) == 4:
print(3 + j)
break
# 1 일단 첫 시작은, 첫 네 알파벳을 묶는 것이다. 미리 만들어둔 빈 리스트인 check에 첫 네 요소를 넣는다.
# 2 set()은 리스트의 요소들 중 겹치는 걸 다 제외한 리스트를 만들어준다. 즉 a = ['a', 'b', 'c', 'c', 'd', 'd', 'd', 'e']이런 리스트가 있다면 set(a)는 ['a', 'b', 'c', 'd', 'e'] 가 되는 것이다. 즉, 겹치는 요소가 있으면 원래의 리스트의 길이보다 set 된 리스트의 길이가 짧아지게 되고 만약 겹치는 게 없다면 원래 리스트의 길이와 set 된 리스트의 길이가 같게 된다. 이를 활용하여 for loop를 짰다.
if 겹치는 알파벳이 있다: 가장 앞에 있는 요소를 지우고 새로운 요소를 추가한다. 이때 인덱스가 3+j가 되는 이유는 처음에 인덱스넘버 3까지 check에 넣어놨었기 때문이다. 새로 들어갈 요소들은 즉, letter_data[3] 이후의 것들이 와야하기 때문에 3+j를 사용한다.
elif 겹치는 알파벳이 없다면: 그 지점의 인덱스를 print 하고 loop를 나온다.
Part Two
이번엔 4개가 아니라 14개가 모두 달라야한다. 개수만 달라졌기 때문에 위의 코드에서 숫자만 바꿔끼워주었다.
file = open("input/day6.txt", "r")
letters_data = file.read()
check = []
for i in range(14):
check.append(letters_data[i])
for j in range(len(letters_data) - 14):
if len(set(check)) != 14:
del check[0]
check.append(letters_data[13 + j])
elif len(set(check)) == 14:
print(13 + j)
break
'컴퓨터 & 코딩 > Python' 카테고리의 다른 글
[Python] Advent of Code 2022 - Day 8 (0) | 2022.12.12 |
---|---|
[Python] Advent of Code 2022 - Day 7 (0) | 2022.12.08 |
[Python] Advent of Code 2022 - Day 5 (0) | 2022.12.06 |
[Python] Advent of Code 2022 - Day 4 (0) | 2022.12.04 |
[Python] Advent of Code 2022 - Day 3 (0) | 2022.12.03 |