[백준/오늘의문제] 04.27

ZenTechie·2023년 4월 27일
0

PS

목록 보기
48/53
post-custom-banner

문제

난이도번호문제 이름
1003피보나치 함수
16937두 스티커
17144미세먼지 안녕!
1030프렉탈 평면

HOW TO SOLVE

  • 피보나치 함수 : DP
  • 두 스티커 : 단순 구현
  • 미세먼지 안녕!: 단순 구현
  • 프렉탈 평면 : 재귀 ( 못 품 ㅠ )

피보나치 함수

'''
- 재귀 -> TLE
'''

# 피보나치
def fibo(n):
    if n == 0: return (1, 0)
    
    # (0 호출 개수, 1 호출 개수)
    dp = [(0, 0) for _ in range(n + 1)]
    
    dp[0] = (1, 0) 
    dp[1] = (0, 1)
    
    # 수열 만들기
    for i in range(2, n + 1):
        dp[i] = (dp[i - 1][0] + dp[i - 2][0], dp[i - 1][1] + dp[i - 2][1])
    
    return dp[n]
    

t = int(input())

for _ in range(t):
    n = int(input())
    one, zero = fibo(n) # 0과 1의 개수
    print(one, zero)

두 스티커

'''
- 스티커는 90도 회전 가능 -> 가로와 세로가 바뀐다는 뜻
- 스티커가 모눈종이를 벗어나면 안됨
- 스티커는 겹치면 안됨
- 총 2개의 스티커를 붙여야 함
- 스티커를 못붙이면 0을 출력
'''
h, w = map(int, input().split()) # 모눈종이 크기
n = int(input()) # 스티커의 수

stickers = [list(map(int, input().split())) for _ in range(n)]

_max = 0
for i in range(n - 1):
    for j in range(i + 1, n):
        h1, w1 = stickers[i]
        h2, w2 = stickers[j]
        
        # 둘 다 회전 안함
        if (w1 + w2 <= w and max(h1, h2) <= h) or (h1 + h2 <= h and max(w1, w2) <= w):
            _max = max(_max, h1 * w1 + h2 * w2)
        # i번 스티커만 회전
        if (h1 + w2 <= w and max(w1, h2) <= h) or (w1 + h2 <= h and max(h1, w2) <= w):
            _max = max(_max, h1 * w1 + h2 * w2)
        # j번 스티커만 회전
        if (w1 + h2 <= w and max(h1, w2) <= h) or (h1 + w2 <= h and max(w1, h2) <= w):
            _max = max(_max, h1 * w1 + h2 * w2)
        # 둘 다 회전
        if (h1 + h2 <= w and max(w1, w2) <= h) or (w1 + w2 <= h and max(h1, h2) <= w):
            _max = max(_max, h1 * w1 + h2 * w2)
        
print(_max)

미세먼지 안녕!

from collections import deque

# 미세먼지 확산
def spread():
    dx, dy = (-1, 1, 0, 0), (0, 0, -1, 1)
    tmp = [[0] * c for _ in range(r)] # 확산 값 저장 리스트
    for x in range(r):
        for y in range(c):
            if graph[x][y] == 0 or graph[x][y] == -1: continue # 미세먼지가 없거나 공기청정기가 있으면 넘어감
            
            d = graph[x][y] // 5 # 확산되는 양
            
            # 상하좌우 확산
            for i in range(4):
                nx, ny = x + dx[i], y + dy[i]
                
                if 0 <= nx < r and 0 <= ny < c and graph[nx][ny] != -1: # 범위 안에 있고 공기청정기가 없으면
                    tmp[nx][ny] += d
                    tmp[x][y] -= d
    
    # 확산 후 원래 리스트 갱신
    for x in range(r):
        for y in range(c):
            graph[x][y] += tmp[x][y]

# 공기청정기 작동 - 위
def air_top():
    dx, dy = (0, -1, 0, 1), (1, 0, -1, 0) # 우, 상, 좌, 하
    x, y, d = up, 1, 0 # 시작 위치, 방향
    prev = 0 # 이전 값 저장
    
    while 1:
        nx, ny = x + dx[d], y + dy[d]
        if x == up and y == 0: break # 공기청정기 위치에 도달하면 종료
        
        # 범위를 벗어난다면, 방향 전환
        if not 0 <= nx < r or not 0 <= ny < c:
            d += 1
            continue
        
        # 이전 값 저장 후 이동
        graph[x][y], prev = prev, graph[x][y]
        x, y = nx, ny
    
# 공기청정기 작동 - 아래
def air_bottom():
    dx, dy = (0, 1, 0, -1), (1, 0, -1, 0) # 우, 하, 좌, 상
    x, y, d = down, 1, 0 # 시작 위치, 방향
    prev = 0 # 이전 값 저장
    
    while 1:
        nx, ny = x + dx[d], y + dy[d]
        if x == down and y == 0: break # 공기청정기 위치에 도달하면 종료
        
        # 범위를 벗어난다면, 방향 전환
        if not 0 <= nx < r or not 0 <= ny < c:
            d += 1
            continue
        
        # 이전 값 저장 후 이동
        graph[x][y], prev = prev, graph[x][y]
        x, y = nx, ny

r, c, t = map(int, input().split())

graph = []

# 미세먼지 정보 입력
for _ in range(r):
    data = list(map(int, input().split()))
    graph.append(data)


up, down = 0, 0 # 공기청정기 위치

# 공기청정기 위치 찾기
for i in range(r):
    if graph[i][0] == -1:
        up, down = i, i + 1
        break
    
# t초 동안 반복
for _ in range(t):
    spread()
    air_top()
    air_bottom()

_sum = 0 # 총 미세먼지 양

# 총 미세먼지 양 계산
for i in range(r):
    _sum += sum(graph[i])

_sum += 2 # 공기청정기가 있는 칸은 제외
print(_sum)

프렉탈 평면

🤮
profile
데브코스 진행 중.. ~ 2024.03
post-custom-banner

0개의 댓글