컴퓨터 & 코딩/Python

[Python] Advent of Code 2022 - Day 8

구로그 2022. 12. 12. 06:46
728x90

Part One

아주 지저분하게 풀어서 자신은 없지만 일단 풀이과정을 써본다. 

 

이번 과제는 99x99의 숫자열이 있다. 

각 숫자들은 나무의 키를 나타낸다. 이때 동서남북으로 얼마나 많은 나무가 보이는지 세는 문제이다. 

동서남북으로 본인보다 키(숫자)가 크거나 같은 나무(숫자)가 있다면 보이지 않는다. 

file = open("input/day8.txt", "r")
trees_list = file.read().splitlines()

tree_list = []
temp = []

# 1
for trees in trees_list:
    for tree in trees:
        temp.append(int(tree))
    tree_list.append(temp)
    temp = []

tree = None
left = []
right = []
top = []
bottom = []

info = []

# function 
def check(tree, list):
    global info
    a = 0
    for i in list:
        if i >= tree:
            a += 1
        else:
            pass
    if a > 0:
        info.append(False)
    elif a == 0:
        info.append(True)


sum = 0

# 2
for i in range(1, len(tree_list)-1):
    for j in range(1, len(tree_list[0])-1):
        tree = tree_list[i][j]
        # 3
        for left_trees in range(j):
            left.append(tree_list[i][left_trees])
        for right_trees in range(j+1, len(tree_list)):
            right.append(tree_list[i][right_trees])
        for top_trees in range(i):
            top.append(tree_list[top_trees][j])
        for bottom_trees in range(i+1, len(tree_list)):
            bottom.append(tree_list[bottom_trees][j])
        check(tree, top)
        check(tree, right)
        check(tree, bottom)
        check(tree, left)
        # 4
        if True in info:
            sum += 1
        left = []
        right = []
        top = []
        bottom = []
        info = []

# 5
print(sum + 99 + 99 + 97 + 97)

# 1 먼저 숫자를 하나하나 따로 담아준다. 예를 들어, 파일을 읽어서 받아온 trees_list가 ["12345", "67890"]라면 [["1", "2", "3", "4", "5"], ["6", "7", "8", "9", "0"]] 이렇게 담아주는 것이다. 나중에 row, column으로 인덱스를 사용하기 위해 하는 과정이다.

 

# 2 for문으로 row, column에 해당하는 숫자를 돌아서 나무를 하나하나 잡아온다. 이때 가장자리 나무들은 카운트되지 않게 범위를 설정해준다. (가장자리 나무는 어차피 보이기 때문에 확인할 필요가 없다) 

 

# 3 해당 나무의 동서남북 나무들을 각각 리스트에 담는다. 본인이나 가장자리가 포함이 되지 않게 범위를 설정한다. 그리고 미리 만들어둔 check 함수를 돈다. 각 방향의 리스트를 돌며 본인보다 큰 수가 있는지 확인하고 있다면 False(보이지 않음)을, 없다면 True(보임)을 info라는 리스트에 넣어준다. 예를 들어, [True, False, False, True] 라면 top, left 쪽에서는 해당 나무가 보인다는 뜻이다.  

 

# 4 이렇게 함수를 다 돌아 info에 각 방향별 true, false 값이 모이면 true가 있는 경우 sum 에 1을 더해준다. 이는 총 몇 개의 나무가 보이는지 카운트하는 것이다. 더해준 다음에는 각 리스트를 비워주어 다음 차례가 올 수 있게 한다. 

 

# 5 마지막으로 sum 값에 가장자리 나무의 개수를 더해주면 총 보이는 나무의 개수가 나온다. 


Part Two는 나중에... ㅜㅜ 

반응형