developer-ellen
인간 디버거의 로그 찍기
developer-ellen
전체 방문자
오늘
어제
  • 분류 전체보기 (217)
    • 회고록 (0)
    • 취뽀 및 커리어 여정의 Stack (2)
      • SSAFY 7기 (2)
    • 프로그래밍공부 (24)
      • c++ (0)
      • JAVA (3)
      • Spring (5)
      • design pattern (3)
      • BackDB (1)
      • Servlet&JSP (3)
      • Vue (4)
      • JPA (4)
      • Infra (1)
      • Linux (0)
    • AI (3)
      • papers (3)
      • trend (0)
    • 프로젝트진행 (0)
      • 데이터베이스 (0)
      • 서버개발 (0)
      • 인공지능 (0)
      • 하루정리 (0)
    • 포트폴리오 (0)
    • 알고리즘 (158)
      • 알고리즘문풀 (155)
      • 알고리즘공부 (3)
    • 통계공부 (15)
      • 시계열분석 (15)
      • 회귀분석 (0)
    • CS (14)
      • 컴퓨터네트워크 (4)
      • 운영체제 (8)
      • 데이터베이스 (2)
    • 주저리주저리 (0)
      • 필사 (0)
    • 취업관련정보 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 삼성코테자바풀이
  • BOJ파이썬풀이
  • SW역량테스트파이썬풀이
  • 삼성코테파이썬준비
  • 삼성코테파이썬풀이
  • 삼성코테구현문제추천
  • 데이터분석
  • 카카오코테
  • MA모형
  • 삼성코테구현풀이
  • ARIMA모형
  • 삼성코테기출
  • 시계열분석
  • 코테파이썬
  • c++디자인패턴
  • 카카오코테java풀이
  • c++ 빌더 패턴
  • AR모형
  • 삼성코테자바꿀팁
  • 통계분석
  • 운영체제인터럽트
  • 삼성코테준비
  • SW역량테스트파이썬
  • 시계열
  • 삼성코테자바준비
  • 삼성코테파이썬
  • 통계학
  • Arima
  • 백준파이썬풀이
  • 삼성코테기출자바풀이

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

알고리즘/알고리즘문풀

BOJ - 나무 재테크 16235번 (python)

2021. 10. 16. 14:06

❓ 문제 - 백준 나무 재테크 16235번 - python 풀이법

출처 

(https://www.acmicpc.net/problem/16235)

 

16235번: 나무 재테크

부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터

www.acmicpc.net

 

 

📝 문제해결법

1. 이 문제는 구현으로 풀었다.

  • 땅의 양분 정보를 저장할 food, 나무의 나이를 저장할 tree, 겨울철에 땅의 양분을 줄 feed 리스트를 사용한다.
  • n의 범위가 1 ~ 10 사이 이므로 리스트로 선언하여 이중 for문을 통에 접근해도 시간 복잡도에 걸리지 않을 수 있다.
  • grow() 함수를 통해 봄과 여름에 대해 처리는 이중 for문으로 리스트 접근할 때 한번에 처리하고 가을과 겨울의 처리는 따로하여 1년을 지나게 한다. k년의 나무 재테크동안 grow() 함수를 k번 호출한 후 tree리스트에 몇 개의 나무가 심어져 있는지 세어서 정답을 출력한다.
  • 봄과 여름에는 나무를 키우고 제거하기 위해서 일단 한 땅에 여러 나무가 심어질 수 있고 양분을 먹어 성장하는 순서는 어린나무부터 하므로 i행 j열에 있는 나무 나이를 정렬하기 위해  tree[i][j] 를  sort해준다. i행 j열에 심어져 있는 나무가 있다면 temp_tree 리스트를 통해 양분을 먹고 나이가 증가한 나무의 나이를 넣어주고, 해당 땅의 양분보다 나이가 많은 나이는 죽은 나무이므로 죽은 나무의 나이를 dead_tree를 통해 저장한다. 또한 봄의 처리 후 여름으로 죽은 나무들의 나이를 합한 것을 2로 나누어 해당 땅에 양분으로 더해주면서 여름을 처리한다.
  • 가을이 오면 모든 땅의 행과 열을 살펴, 해당 땅의 나무가 만약 5로 나누어진다면  dx, dy를 활용해 8방향으로 나무가 번식될 수 있어서 해당 nx, ny가 인덱스 범위에 들어가면 해당 탐색된 지역에 나이가 1살인 나무를 추가해준다.
  • 겨울이 되면 땅의 양분을 추가하기 위해 입력받은 추가되는 양분의 양을 현재 땅의 양분의 양에 더해준다.

2. 문제 풀면서 생겼던 이슈들

  • 처음 봄,여름,가을,겨울을 따로 처리하기로 구현했고, 봄에서 죽은 나무들의 정보를 queue에 입력받아 여름이 오면 죽은 나무들을 양분으로 바꾸도록 하였더니 시간초과가 발생했다. -> 이중 for문 안에서 같이 처리될 수 있으면 시간 절약을 위해 같이 구현해야겠다.
  • 중간 중간 입출력 예시들을 print문으로 처리해서 구현의 오류를 해결해보자.

 

 

 

💻 소스코드

n, m, k = map(int, input().split())
tree = [[[] for _ in range(n)] for _ in range(n)]

feed = [list(map(int, input().split())) for _ in range(n)]
for _ in range(m):
    x, y, z = map(int, input().split())
    tree[x-1][y-1].append(z)

food = [[5] * n for _ in range(n)]
dx = [-1, 1, 0, 0, -1, -1, 1, 1]
dy = [0, 0, -1, 1, 1, -1, -1, 1]


def grow(food, tree):
    for i in range(n):
        for j in range(n):
            if tree[i][j]:
                tree[i][j].sort()
                temp_tree, dead_tree =[], 0
                for t in tree[i][j]:
                    if food[i][j] >= t:
                        food[i][j] -= t
                        t += 1
                        temp_tree.append(t)
                    else:
                        dead_tree += t // 2
                food[i][j] += dead_tree
                tree[i][j] = []
                tree[i][j].extend(temp_tree)

    for i in range(n):
        for j in range(n):
            if len(tree[i][j]) == 0:
                continue
            for p in range(len(tree[i][j])):
                if (tree[i][j][p] % 5 == 0):
                    x, y = i, j
                    for q in range(8):
                        nx = x + dx[q]
                        ny = y + dy[q]
                        if 0 <= nx < n and 0 <= ny < n:
                            tree[nx][ny].append(1)

    for i in range(n):
        for j in range(n):
            food[i][j] += feed[i][j]


for _ in range(k):
    grow(food, tree)

answer = 0
for i in range(n):
    for j in range(n):
        answer += len(tree[i][j])

print(answer)

 

 

 

'알고리즘 > 알고리즘문풀' 카테고리의 다른 글

BOJ - 미세먼지 안녕! 17144번 (python)  (0) 2021.10.16
BOJ - 아기 상어 16236번 (python)  (0) 2021.10.16
BOJ - 치킨 배달 15686번 (python)  (0) 2021.10.16
BOJ - 드래곤 커브 15685번 (python)  (0) 2021.10.16
BOJ - 사다리 조작 15684번 (python)  (0) 2021.10.15
    '알고리즘/알고리즘문풀' 카테고리의 다른 글
    • BOJ - 미세먼지 안녕! 17144번 (python)
    • BOJ - 아기 상어 16236번 (python)
    • BOJ - 치킨 배달 15686번 (python)
    • BOJ - 드래곤 커브 15685번 (python)
    developer-ellen
    developer-ellen

    티스토리툴바