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를 사용해서 하는 방법이 있을 것 같은데 나중에 다시 짜봐야겠다.
'컴퓨터 & 코딩 > Python' 카테고리의 다른 글
[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 2 (0) | 2022.12.02 |
[Python] Advent of Code 2022 - Day 1 (0) | 2022.12.02 |
[혼공학습단 8기][혼공파] 7주 동안의 혼공학습단 후기 (0) | 2022.08.16 |