하루살이 개발자

[백준] 자료구조 유형 본문

코딩테스트

[백준] 자료구조 유형

하루살이 2023. 3. 14. 00:35

# boj_17413 단어뒤집기2 - 실버3

import sys
word = list(sys.stdin.readline().rstrip())

i = 0
start = 0
while i < len(word):
    if word[i] == "<":
        i += 1
        while word[i] != ">":
            i += 1
        i += 1
    elif word[i].isalnum(): # 숫자나, 알파벳을 만나면
        start = i
        while i < len(word) and word[i].isalnum():
            i += 1
        t = word[start:i]
        t.reverse()
        word[start:i] = t
    else:
        i += 1
print(''.join(word))

[python 정리]

isalnum(): 문자열이 영어, 한글 혹은 숫자로 되어있으면 참 리턴, 아니면 거짓 리턴 -> 영어, 한글, 숫자

isalpha(): 문자열이 영어 혹은 한글로 되어있으면 참 리턴, 아니면 거짓 리턴 -> 영어, 한글

 

# boj_17298 오큰수 - 골드4

이중 for 문으로 돌면 시간초과 남 -> stack을 이용해서 해결하기

import sys
from collections import deque
input = sys.stdin.readline
n = int(input())
nums = list(map(int, input().split()))

answer = [-1] * n
stack = deque()

for i in range(n):
    while stack and (stack[-1][0] < nums[i]):
        a, index = stack.pop()
        answer[index] = nums[i]
    stack.append([nums[i], i])

print(*answer)

 

# boj_17299 오등큰수 - 골드3

- 오큰수와 매우 유사한 문제

- Counter을 이용해서 각 숫자 별 갯수를 먼저 구해놓아야 한다

import sys
from collections import Counter
from collections import deque
input = sys.stdin.readline
n = int(input())
nums = list(map(int, input().split()))

c = Counter(nums)
answer = [-1] * n
stack = deque() 
for i in range(len(nums)):
    while stack and (c[stack[-1][0]] < c[nums[i]]):
        a, index = stack.pop()
        answer[index] = nums[i]
    stack.append([nums[i], i])

print(*answer)

[Python]

from collections import Counter

nums = [1, 1, 2, 3, 4, 2, 1]

c = Counter(nums) 
print(c) # Counter({1: 3, 2: 2, 3: 1, 4: 1})

# boj_1935 후위표기식2 - 실버3

 

ord(i) - ord('A')를 이용해서 스택에 저장하는 것이 포인트!

from collections import deque
n = int(input())
s = input() 
l = []
stack = deque()
for i in range(n):
    l.append(int(input()))


answer = l[0]
for i in s:
    if i.isalpha():
        stack.append(l[ord(i) - ord('A')]) # 0 1 2 3 4
    else:
        s2 = stack.pop()
        s1 = stack.pop()

        if i == '*':
            stack.append(s1 * s2)
        elif i == '+':
            stack.append(s1 + s2)
        elif i == '/':
            stack.append(s1 / s2)
        elif i == '-':
            stack.append(s1 - s2)

print('%.2f' %stack[0])

[Python]

소수 두번째 자리까지 출력 - print('%.2f' %stack[0])

 

# boj_1918 후위표기식 - 골드2

우선순위: () -> * / -> * -

import sys
input = sys.stdin.readline

letters = input()
stack = []
ans = ''
for i in letters:
    if i.isalpha():
        ans += i
    else:
        if i == '(':
            stack.append(i)
        elif i == '*' or i == '/': # 먼저 들어오고 같은 우선순위에 있는 */는 ans에 넣어줌
            while stack and (stack[-1] == '*' or stack[-1] == '/'):
                ans += stack.pop()
            stack.append(i)
        elif i == '+' or i == '-': #이보다 낮은 우선 순위가 없어서 연산자이면 전부 ans에 넣어줌
            while stack and stack[-1] != '(':
                ans += stack.pop()
            stack.append(i)
        elif i == ')': # 닫음 괄호와 열음 괄호 사이에 있는 연산자들 전부 반환
            while stack and stack[-1] != '(':
                ans += stack.pop()
            stack.pop()
 

while stack:
    ans += stack.pop()
print(ans)

 

# boj_10820 문자열 분석

- rstrip('\n'): 줄바꿈 무시

import sys
input = sys.stdin.readline
while True:
    line = input().rstrip('\n')
    if not line:
        break
    l, u, d, s = 0, 0, 0, 0
    for target in line:
        if target.islower(): # 소문자
            l += 1
        elif target.isupper(): # 대문자
            u += 1
        elif target.isdigit(): # 숫자
            d += 1
        elif target.isspace(): # 공백
            s += 1

    print(l, u, d, s)