본문 바로가기
알고리즘/백준

[백준]230220 문제풀이

by stubborngastropod 2023. 2. 21.
728x90

14719. 빗물

h, w = map(int, input().split())
blocks = list(map(int, input().split()))
higher = [0] * w
higher[0] = blocks[0]
water = 0

for i in range(1, w):
    # 현재 블록이 이전 블록보다 작을때 상한값을 이전의 상한값까지 올려줌
    if blocks[i] < blocks[i-1]:
        higher[i] = higher[i-1]
    # 현재 블록이 이전 블록보다 클때
    elif blocks[i] >= blocks[i-1]:
        # 현재 블록이 이전 상한값보다 작을 때, 더 큰 블록을 만날때까지 땅을 메꾸고 water 올리기
        if blocks[i] <= higher[i-1]:
            cnt = 1
            while blocks[i] > blocks[i-cnt]:
                water += blocks[i] - blocks[i-cnt]
                blocks[i - cnt] = blocks[i]
                cnt += 1
            higher[i] = higher[i-1]
        # 현재 블록이 이전 상한값보다 클 때, 이전 상한값까지 땅을 메꾸고 water 올리기
        elif blocks[i] > higher[i-1]:
            for j in range(i):
                water += higher[j] - blocks[j]
                blocks[j] = higher[j]
            higher[i] = blocks[i]
print(water)

예전에 풀었던 스택문제랑 비슷한데 계속 안풀려서 엄청 멘붕이 왔다. 블록을 쭉 나열해놓고 이전의 블록과 비교하면서 여태까지의 최대값인 higher를 계속 저장해주면서 진행하다가 블록의 높이가 높아지면 최대값과 높이를 비교해서 각 조건에 맞게 고이는 물을 저장해줬다.

4963. 섬의 개수

import sys
sys.setrecursionlimit(10**6)

dy = [-1, -1, -1, 0, 0, 1, 1, 1]
dx = [-1, 0, 1, -1, 1, -1, 0, 1]

def dfs(y, x, visitlist):
    for d in range(8):
        if y + dy[d] in range(h) and x + dx[d] in range(w):
            if (y + dy[d], x + dx[d]) not in visitlist and MAP[y + dy[d]][x + dx[d]] == '1':
                visited[y + dy[d]][x + dx[d]] = 1
                visitlist.append((y + dy[d], x + dx[d]))
                dfs(y + dy[d], x + dx[d], visitlist)
            else:
                visited[y + dy[d]][x + dx[d]] = 1
while True:
    w, h = map(int, input().split())
    if w == h == 0:
        break
    MAP = []
    for i in range(h):
        MAP.append(list(map(str, input().split())))
    visited = [[0] * w for _ in range(h)]
    visitlist = []
    cnt = 0
    for y in range(h):
        for x in range(w):
            find = False
            if not visited[y][x] and MAP[y][x] == '1':
                visitlist.append((y, x))
                visited[y][x] = 1
                dfs(y, x, visitlist)
                find = True
            if find:
                cnt += 1
    print(cnt)

분명히 맞게 한 것 같은데 안풀려서 빗물에 이어 멘탈이 와르르 무너진 문제. 심지어 실2인데 왜 틀리는지 감조차 잡지 못하고 있어서 맘고생 좀 했다. 근데 setrecursionlimit을 이용하니 바로 풀릴줄이야... 재귀 말고 다른 방식으로 풀었으면 또 가능했을지 모르겠으나, 이번을 계기로 좀 더 기본부터 차근차근 밟아나가는 연습을 해야겠다 + 알고리즘 분류 안 보고 푸는 연습도

1992. 쿼드트리

N = int(input())
video = []
for i in range(N):
    video.append(str(input()))

def quadtree(lst, n):
    isone = iszero = True
    while isone:
        for i in range(n):
            for j in range(n):
                if lst[i][j] != '1':
                    isone = False
        break
    while iszero:
        for i in range(n):
            for j in range(n):
                if lst[i][j] != '0':
                    iszero = False
        break
    if isone:
        print('1', end = '')
    elif iszero:
        print('0', end = '')
    else:
        lst1 = [lst[i][:n // 2] for i in range(0, n // 2)]
        lst2 = [lst[i][n // 2:] for i in range(0, n // 2)]
        lst3 = [lst[i][:n // 2] for i in range(n // 2, n)]
        lst4 = [lst[i][n // 2:] for i in range(n // 2, n)]
        print('(', end = '')
        quadtree(lst1, n // 2)
        quadtree(lst2, n // 2)
        quadtree(lst3, n // 2)
        quadtree(lst4, n // 2)
        print(')', end = '')

quadtree(video, N)

약간의 노가다가 가미된 문자열 연습문제. 범위랑 괄호 생각만 조금 해주면 바로 풀 수 있다

9935.문자열 폭발

import sys

string = list(map(str, sys.stdin.readline().strip()))
bomb = str(sys.stdin.readline().strip())
stack = []
for i in string:
    stack.append(i)
    while len(stack) >= len(bomb):
        if stack[-len(bomb):] == list(bomb):
            for _ in range(len(bomb)):
                stack.pop()
        else:
            break
if stack:
    print(*stack, sep = '')
else:
    print('FRULA')

확실히 알고리즘 개념에 따른 난이도가 명확하게 드러난다고 느낀 문제. 별다른 테크닉 없이 그냥 풀어도 속임수 없이 답이 바로 나온다. 문자열 최고...

 

전반적으로 3일간 멘탈이 많이 취약해졌는데, 시간은 아직 꽤 있으니 여유롭게 마음 잡고 공부해야겠다.

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준]230225 문제풀이  (0) 2023.02.25
[백준]230223-24 문제풀이  (0) 2023.02.24
[백준]230217 문제풀이  (0) 2023.02.18
[백준]230215-16 문제풀이  (0) 2023.02.16
[백준]230214 문제풀이  (0) 2023.02.14

댓글