본문 바로가기

매일 TIL

[내일배움캠프 4-1일] 알고리즘 스쿼드 과제

단어공부

def most_frequent_alphabet(word):

    word = word.upper()
    word_list = list(set(word))

    cnt = []
    for i in word_list:
        cnt.append(word.count(i))
    # 리스트 컴프리헨션
    # cnt = [word.count(char) for char in word_list]


    if cnt.count(max(cnt)) > 1:
        return '?'
    else:
        return word_list[cnt.index(max(cnt))]

word = input()
print(most_frequent_alphabet(word))

전부 대문자로 변경

word_list를 만들어 중복 제거

word_list안의 알파벳을 돌면서 word 안에 몇개나 있는지 카운트해 cnt 리스트에 추가

최고 카운트가 1개 이상이면 '?' 반환, 아니라면 word_list에서 cnt의 최댓값 인덱스와 동일한 인덱스의 요소 리턴


스택

import sys
# 반복문 안에서 input을 받는 경우 시간초과가 발생
# 이를 해결하기 위해서 sys.stdin.readline()을 사용한다
input = sys.stdin.readline

def stack_commands():
    N = int(input())
    stack = []

    for _ in range(N):
        # input().split()을 통해 공백을 기준으로 문자열을 나눠 리스트로 반환
        command = input().split()

        if command[0] == 'push':
            stack.append(command[1])
        elif command[0] == 'pop':
            if len(stack) == 0:
                print(-1)
            else:
                print(stack.pop())
        elif command[0] == 'size':
            print(len(stack))
        elif command[0] == 'empty':
            if len(stack) == 0:
                print(1)
            else:
                print(0)
        elif command[0] == 'top':
            if len(stack) == 0:
                print(-1)
            else:
                print(stack[-1])

stack_commands()

그냥 주어진 command가 무엇인지에 따라 지정해주면 된다.

push는 공백을 기준으로 숫자 정보도 같이 들어오기 때문에 이를 input().split()으로 받아 리스트로 사용. 0번째 인자인 push를 사용하고 1번째 인자인 숫자를 stack에 append하면 된다


괄호

import sys
input = sys.stdin.readline

T = int(input())

for _ in range(T):
    stack = []
    ps = input()
    for i in ps:
        # 여는 괄호면 stack 리스트에 추가
        if i == '(':
            stack.append(i)
        # 아닌 경우(닫는 괄호) 스택이 비어있다면 NO, 스택이 비어있지 않으면 pop
        else:
            if stack:
                stack.pop()
            else:
                print("NO")
                break
    # break 하지 않고 왔을 경우
    else:
        # stack 리스트가 비어있으면 짝이 잘 맞는 것
        if len(stack) == 0:
            print("YES")
        # 뭔가 남아있다면 NO(여는 괄호 남아있는 경우)
        else:
            print("NO")

카드1

from collections import deque

def test_problem_queue(num):
    # deq라는 리스트에 deque형태로 1부터 num까지 입력 -> deque([1, 2, 3, ... N])
    deq = deque([i for i in range(1, num+1)])
    answer = []
    # deq 리스트 안에 한 개 남을 때까지 반복
    while len(deq) > 1:
        # 하나 버리고
        answer.append(deq.popleft())
        # 하나 마지막 인덱스로 옮기고
        deq.append(deq.popleft())
    # 한 개 남았을 때도 마지막으로 append 후 answer 리스트 반환
    answer.append(deq.popleft())
    return answer

N = int(input())
result = test_problem_queue(N)

# map 함수를 통해 result 리스트 안의 숫자를 문자열(str)로 변환
# 이후 " ".join을 통해 공백으로 구분하여 출력
print(" ".join(map(str, result)))

프린터큐(실패)

from collections import deque

# T = int(input())

N, M = map(int, input().split())
importance = deque(list(map(int, input().split())))
result = []

while importance:
    first_num = importance.popleft()
    if first_num == max(importance):
        result.append(first_num)
    else:
        importance.append(first_num)

print(result)

우선 로직만 구성하는데 그마저도 실패.

deque는 for문에서 변경이 불가능하다는 점을 알게됨.

while문으로 진행중 무한루프 발생.

내일 마저 해보자.(문제 다시 잘 보기)


오늘의 회고

집중해서 잘 공부했다. 하지만 긴장감이 없이 문제만 풀다보니 살짝 늘어지는 감이 있는듯.

목표로 한 2주차 진입은 실패. 생각보다 알고리즘 공부하면서 이것저것 찾아보고 하니까 시간이 금방 지나감.

내일의 목표는 2주차 4번까지 듣기 + 오늘 못한 프린터큐 과제 마무리, 내일 스쿼드 과제 완료하기