알고리즘/백준

[백준]230127 문제풀이

stubborngastropod 2023. 1. 30. 20:45
728x90

2304. 창고 다각형

N = int(input())
cols = []
for i in range(N):
    LH = list(map(int, input().split()))
    cols.append(LH)
cols1 = sorted(cols, key = lambda x: x[0])
cols2 = sorted(cols, reverse = True, key = lambda x: x[0])

list1, list2 = [], []
for i in cols:
    list1.append(i[0])
    list2.append(i[1])
A = max(list1) - min(list1) + 1
B = max(list2)

s1 = 0
a, b = cols1[0][0], cols1[0][1]
for i in cols1[1:]:
    if i[1] > b:
        a = i[0] - a
        s1 += a * (i[1] - b)
        a = cols1[0][0]
        b = i[1]

s2 = 0
a, b = cols2[0][0], cols2[0][1]
for i in cols2[1:]:
    if i[1] > b:
        a = a - i[0]
        s2 += a * (i[1] - b)
        a = cols2[0][0]
        b = i[1]

print((A * B) - (s1 + s2))

원랜 높이가 최대값인 요소에서 양쪽으로 내려가려고 했는데 잘 안돼서 컨닝 후 양쪽에서 한번씩 밀어보는 식으로 구현했다. 이제 안풀리면 답지 보는 연습을 해야한다

2841. 외계인의 기타연주

import sys

guitar = []
for i in range(6):
    guitar.append([0])
count = 0

N, P = map(int, sys.stdin.readline().split())

for i in range(N):
    string, pret = map(int, sys.stdin.readline().split())
    if pret > guitar[string - 1][-1]:
        guitar[string - 1].append(pret)
        count += 1
    elif pret < guitar[string - 1][-1]:
        while pret < guitar[string - 1][-1]:
            count += 1
            guitar[string - 1].pop(-1)
        if pret > guitar[string - 1][-1]:
            guitar[string - 1].append(pret)
            count += 1
    else:
        pass

print(count)

기타를 이미 알고있지 않았다면 적잖이 당황했을 듯. 손가락 떼는것도 잘 고려해서 풀어냈다(시간 초과 뜰때면 어김없이 찾아오는 import sys...)

9012. 괄호

T = int(input())
for i in range(T):
    ps = input()
    stack = 0
    for j in ps:
        if j == '(':
            stack += 1
        elif j == ')':
            stack -= 1
            if stack < 0:
                break
    if stack == 0:
        print('YES')
    else:
        print('NO')

해답이 바로 떠올라서 의외로 쉽게 푼 문제. 그리디도 그렇고 첨부터 발상이 좋으면 쉽게 풀리는 것 같다.

10799. 쇠막대기

ps = input()
pipes = 0
cut = 0
for i in range(len(ps)):
    if ps[i] == '(':
        pipes += 1
    elif ps[i] == ')' and ps[i-1] == '(':
        pipes -= 1
        cut += pipes
    elif ps[i] == ')':
        pipes -= 1
        cut += 1
print(cut)

마찬가지로 보자마자 해법이 잘 떠올랐다. 문제는 풀면서 계속 답을 확인하면서 오류를 찾게 되는데, 애초에 계획을 잘 세워야 코드가 깔끔하게 나올 것 같다.

10828. 스택

import sys

N = int(sys.stdin.readline())
stack = []
for i in range(N):
    cmd = str(sys.stdin.readline().strip())
    if cmd == 'pop':
        if stack == []:
            print('-1')
        else:
            print(stack.pop(-1))
    elif cmd == 'size':
        print(len(stack))
    elif cmd == 'empty':
        if stack == []:
            print('1')
        else:
            print('0')
    elif cmd == 'top':
        if stack == []:
            print('-1')
        else:
            print(stack[-1])
    else:
        num = cmd.strip('push ')
        stack.append(int(num))

제목부터 스택 개념 잡기 위한 문제... 자료형 생각하기만 좀 귀찮았다

728x90