컴퓨터 & 코딩/Python

[Python] Advent of Code 2022 - Day 10

구로그 2022. 12. 14. 03:15
728x90

이번 인풋데이터는 addx N(정수)와 nood로 구성 된 프로그램이 들어있었고

addx N은 cycle이 두 번 일어나고, cycle이 끝날 때 value가 N만큼 더해지는 반면

nood는 cycle이 한 번 일어나는 것 외에 다른 동작은 하지 않는다. 

인풋 데이터의 프로그램을 돌렸을 때 20번째, 60번째, 100번째, 140번째, 180번째, 220번째 사이클에서의 value 값을 구해내어 각각의 사이클값과 곱한 값을 총 더 해주면 몇이 되는지 구해야 한다. 

file = open("input/day10.txt", "r")
data = file.read().splitlines()

program_proceeds = []

for line in data:
    program_proceeds.append(line.split())

x = 1
cycle = 0

sum = 0
sum_list = []
cycle_list = []

for program in program_proceeds:
    if program[0] == "addx":
        for i in range(2):
            cycle += 1
            if cycle % 40 == 20:
                sum = cycle * x
                sum_list.append(sum)
                cycle_list.append(cycle)
        x += int(program[1])
    else:
        cycle += 1
        if cycle % 40 == 20:
            sum = cycle * x
            sum_list.append(sum)
    sum = 0

result = 0

for i in sum_list:
    result += i
    
print(result)

저번과 마찬가지로 일단 값을 띄어쓰기로 나눠준다음 리스트에 넣어 새로운 리스트에 담아준다. 그 새로운 리스트를 돌며 addX로 시작하는 것과 nood로 시작하는 것을 나누고 addX면 cycle에 2를 더해주고 nood면 cycle에 1을 더해준다.

 

이때 그냥 cycle += 2를 하지 않고 for문으로 돌린 이유는 사이클을 2씩 뛰어넘으면 우리가 원하는 20, 60, 100, 140, 180, 220 싸이클을 넘겨 버릴 수 있기 때문이다. 그렇기 때문에 사이클이 차곡차곡 1씩만 올라가기 위해 for문으로 돌려주었다. 

 

for 문 안에서는 cycle이 1씩 늘어난 다음 현재 사이클이 우리가 원하는 지점인지 아닌지 확인한다. 우리가 원하는 지점이라면 미리 지정해둔 x라는 변수에 사이클 값을 곱해 sum이라는 변수에 넣어준다. 그리고 sum_list라는 리스트에 그 sum을 추가해준다. 나중에 값을 모아 더해주기 위함이다. 여기서 사용하는 x라는 변수의 값은 for문을 다 돈 다음 업데이트 된다. 

 

싸이클이 한 번 돌 때에도 (addx N이 아닌 nood일 때) 우리가 원하는 싸이클 지점을 지나갈 수 있기 때문에 확인을 해주는 과정을 거쳐야한다. 마지막으로 sum값을 초기화해준다. 이 과정이 for문에서 반복된다. 

 

결과값은 sum_list에 쌓인 여섯개의 값을 더해주면 나온다. 

 


 

이전거에 비하면 비교적 단순해서 쉽게 풀었는데

중간에 for문을 어디에 어떻게 쓰고 값을 어디서 업데이트해야하는지 생각해봐야 했다. 

이때까지 배워서 썼던 방식과는 살짝 달라서 코드 짜면서 재미가 있었다.  

반응형