컴퓨터 & 코딩/Python

[Python] Advent of Code 2022 - Day 6

구로그 2022. 12. 6. 21:33
728x90

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
반응형