[알고리즘 기초] - 201-자료구조1(연습)

양진혁·2022년 11월 21일
0

백준

목록 보기
13/21

17413_단어 뒤집기2

⭕풀이:

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

i = 0
start = 0

while i < len(word):  #word로 입력한 문자열의 길이가 i보다 크다면 계속 반복해라.
    if word[i] == "<":  #word의 문자열이 "<" 이면,
        i += 1  #i에 1씩 더하고,
        while word[i] != ">":  #word의 문자열이 ">"가 나오기 전까지
            i += 1  #i에 1씩 더해라.
        i += 1  #닫힌 괄호를 만난 후 인덱스를 하나 증가시킨다.
    elif word[i].isalnum():  #word의 문자열이 알파벳이거나 숫자일 경우,
        start = i  
        while i < len(word) and word[i].isalnum():  #i가 문자열의 길이보다 작고 알파벳이거나 숫자라면,
            i += 1  #계속해서 i에 1씩 더해라.
        tmp = word[start:i]  #i가 여전히 알파벳이거나 숫자이지만, 더 이상 문자열의 길이보다 작지 않고 같다면, tmp는 처음 알파벳 or 숫자가 나온 지점부터 문자열의 길이까지이다.
        tmp.reverse()  #tmp의 순서를 바꿔 뒤집는다.
        word[start:i] = tmp  #tmp를 다시 변수선언한다.
    else:  #문자열이 괄호도 아니고 알파,숫자도 아닌 공백이라면,
        i += 1  #i에 1씩 더해라.

print("".join(word))  #공백없이 문자열을 붙여서 나열해라.



📌필요지식

1) isalnum()

  • while문에서 문자열이 영어, 한글 혹은 숫자로 되어 있으면 참을 리턴, 아니면 거짓을 리턴합니다.

2) isalpha()

  • 문자열이 영어 혹은 한글로 되어있으면 참을 리턴, 아니면 거짓을 리턴합니다.

https://it-neicebee.tistory.com/43


10799_쇠막대기

⭕풀이:

bar_razor = list(input())  #괄호열
answer = 0  #쇠막대기의 갯수 카운트
st = []  "("가 들어가 있을 리스트 st

for i in range(len(bar_razor)):  #괄호 하나씩 반복해 검사
    if bar_razor[i] == '(':  #괄호가 "("이면, 
        st.append('(')  #해당 괄호를 st에 넣는다.

    else:  #괄호가 ")"이면,(=두 가지 경우이다. 상반된 괄호열 "()"이 나와 레이저를 표현하는지, 연속된 괄호열 "))" 이 나와 쇠막대기를 표현하는지,) 
        if bar_razor[i-1] == '(':  #"("가 나와 레이저일 경우,  
            st.pop()  #st에서 "("를 하나 빼내(= st.pop()한 "(" + i에서 반복 중인 ")" 는 레이저이므로)             
            answer += len(st)  #i+1이 "(" 이 나와 st에 있는 "(" 들은 모두 쇠막대기이므로 len(st)는 쇠막대기의 갯수와 같다.    
        else:  #")"가 나와 쇠막대기일 경우,
            st.pop()  #st에 있던 "("를 빼내
            answer += 1  #쇠막대기의 갯수에 하나 늘린다.

print(answer)

17928_오큰수

⭕풀이:

N = int(input())  #입력값의 개수
numbers = list(map(int, input().split()))  #입력된 값을 리스트에 넣은 리스트

stack = [0]  #stack은 for문을 통해 numbers 리스트의 입력된 요소값을 하나씩 검사하기 위해 순서를 메김.
answer = [-1] * N  #answer는 [-1, -1,.. -1]의 형태로 오큰수를 담는 리스트로 '-1'인 이유는 오큰수가 없는 값에 대해 '-1'을 부여하기 때문이다.

for i in range(1, N):  #for문을 통해 1부터 N-1까지 i에 대입해 아래를 반복해라.
    while stack and numbers[stack[-1]] < numbers[i]:  #stack에 값이 있어서 True를 부여받고, numbers의 stack의 마지막 값 번째와 비교하는 이유는 현재 stack = [0]인 stack리스트에 마지막에 1부터 시작하는 i를 리스트에 요소값으로 추가하기 때문에 다음 for문을 반복할 때, while문을 실행시키기 위해선 마지막 값으로 들어온 요소값이 numbers의 i번째 해당되는 값과 비교해야 되기 때문이다.
        answer[stack.pop()] = numbers[i]  #numbers[i-1]의 오큰수가 나왔다면, stack의 마지막 요소값을 제거한 후, answer의 해당 요소값번째는 곧 number[i-1]의 오큰수, numbers[i]이기 때문에 answer의 요소값을 제거하고, 이를 변수선언한다.
    stack.append(i)  #만약, 현재 i가 오큰수를 구하지 못했다고 하더라도 stack에 현재 인덱스i를 추가해야 한다. 그래야 이어서 i+1의 오큰수를 구할 수 있고, i+1의 오큰수를 구하면 자동으로 i의 오큰수도 구하게 되기 때문이다.

print(*answer)



📌필요지식

1) print(*리스트)

  • 인수를 순서대로 넣을 때 리스트나 튜플을 사용할 수 있는데, 리스트와 튜플 앞에 *(애스터리스크)를 붙여 인자들을 일일히 넘기는 효과와 같은 효과를 줍니다.
    즉, "리스트의 포장을 풀어준다"라고 이해하면 됩니다.

https://rabo0313.tistory.com/entry/Python-list%EC%95%9E%EC%97%90-%EB%B6%99%EC%9D%80-unpacking


17299_오등큰수

⭕풀이:

from collections import Counter
from sys import stdin

N = int(input())
numbers = list(map(int, stdin.readline().split()))
numbers_count = Counter(numbers)
stack = [0]
answer = [-1] * N

for i in range(1, N):
    while stack and numbers_count[numbers[stack[-1]]] < numbers_count[numbers[i]]:
        answer[stack.pop()] = numbers[i]
    stack.append(i)

print(*answer)

profile
타이밀크티는 맛있습니다.

0개의 댓글