컴퓨터 & 코딩/Python

[Python] Advent of Code 2022 - Day 3

구로그 2022. 12. 3. 22:11
728x90

Part one 

대문자/소문자 알파벳이 섞인 string들을 다 반 씩 나누고 그 각각의 절반에 공통으로 들어있는 알파벳을 구해내어, 알파벳에 해당하는 숫자값들의 합을 구하는 문제. 

 

import string

# 1
file = open("input/day3.txt", "r")
rucksacks_list = file.read().splitlines()

character_list = []

# 2
for rucksack in rucksacks_list:
    first, second = rucksack[:len(rucksack)//2], rucksack[len(rucksack)//2:]
    # 3
    for character in first:
        if character in second:
            character_list.append(character)
            if character in character_list:
                break

# 4
sum = 0

for character in character_list:
    if character.islower():
        sum += string.ascii_lowercase.index(character) + 1
    elif character.isupper():
        sum += string.ascii_uppercase.index(character) + 27

print(sum)

 # 1 먼저 파일을 열어 하나의 리스트로 데이터를 받아오고 

# 2 for 문을 돌며 리스트 요소들을 하나하나 받아와 절반으로 나눈다 

# 3 앞 절반 string을 돌며 해당 알파벳이 뒷 절반 string에 있는지 확인하고, 만약 있다면 리스트 변수에 넣어준다.

이때 해당 알파벳이 두 개 이상 있는 경우가 있기 때문에 두 번 이상 리스트에 추가되는 것을 막기 위해, 해당 알파벳이 이미 list에 있다면 for문을 벗어나게 한다. 

# 4 이제 공통포함된 알파벳들이 담김긴 리스트들을 돌면서 알파벳의 인덱스 값을 활용하여 최종 sum 값을 구해준다.  

string.ascii_lowercase.index('a') 
>> 0
string.ascii_uppercase.index('B')
>> 1
string.ascii_letters.index('C')
>> 28

string.ascii_letter.index()로 해도될 것 같긴한데 알아보기 쉽게 하기 위해 lowercase, uppercase를 따로 썼다. 

 

Part two

string을 세 줄 씩 묶어서 세 string이 공통으로 갖고 있는 알파벳을 뽑아낸다음, 마찬가지로 해당하는 값들의 합을 구해야하는 문제. 

# 2'
temp_list = []
new_rucksacks_list = []


for rucksack in rucksacks_list:
    temp_list.append(rucksack)
    if len(temp_list) == 3:
        new_rucksacks_list.append(temp_list)
        temp_list = []

# 3'
character_list = []

for list in new_rucksacks_list:
    first, second, third = list[0], list[1], list[2]
    for character in first:
        if character in second and character in third:
            character_list.append(character)
            if character in character_list:
                break

part 1에서 #1과 #4는 동일하고 그 가운데 #2, #3 부분만 바꿨다. 

 

# 2' string 데이터를 세 줄씩 묶어서 하나의 리스트로 만들고 temp_list에 넣어준다.

그리고 (temp_list에 세 개가 다 차면) 그 리스트를 새로운 리스트(new_rucksacks_list)에 넣어주고 temp_list를 비워준다.

이 과정을 for문을 통해 반복한다.

>> [['a', 'b', 'c'], ['d', 'e', 'f'], ... ]

 

# 3' 리스트 인덱스를 활용하여 각각 변수에 넣어준다. 첫 번째 요소의 알파벳을 하나하나 돌며, 해당 알파벳이 두 번째, 세 번째 요소에도 들어가있는지 확인한다. 만약 들어가있다면 character_list에 값을 넣어주고, 동일한 알파벳이 중복으로 들어가는 걸 막기 위해 if문을 활용하여 break를 걸어준다. 

 


part one 어렵지 않게 풀고 part two 금방 풀 줄 알았는데

일단 세 개 묶음으로 다시 리스트 만드는 게 생각보다 오래걸렸다 ;;

range를 사용해서 하는 방법이 있을 것 같은데 나중에 다시 짜봐야겠다. 

 

반응형