정화 코딩

매일 문제 풀기 - 8월 넷째 주 본문

PS

매일 문제 풀기 - 8월 넷째 주

jungh150c 2023. 8. 22. 03:01

8/21. 벌집 (백준 2292번)

 

https://www.acmicpc.net/problem/2292

 

#python

n = int(input())
count = 1
num = 1

while n > num :
    num += count * 6
    count += 1

print(count)

 

헷갈려서 이런 식으로 그려가면서 규칙을 찾았다. 각 줄에서 최대인 수는 1, 7, 19, 37, 61인데, 공차가 6, 12, 18 이런 식으로 6의 배수였다. (정답)

 


 

8/21. 괄호 (백준 9012번)

 

https://www.acmicpc.net/problem/9012

 

#python

import sys

num = int(sys.stdin.readline())
count = 0

while count < num :
    data = sys.stdin.readline().strip()
    stack = []
    isValid = True

    for i in range (0, len(data)) :
        if data[i] == '(' :
            stack.append('a')
        elif data[i] == ')' :
            if len(stack) == 0 :
                isValid = False
                break
            else :
                del stack[len(stack)-1]

    if not isValid :
        print("NO")
    elif len(stack) == 0 :
        print("YES")
    else :
        print("NO")

    count += 1

 

스택 문제인 듯 하다. 나는 스택이라는 클래스를 따로 만들지 않고 그냥 리스트를 스택처럼 사용해봤다. '('가 들어오면 스택에 a를 넣고 ')'가 들어오면 스택에 있는 a를 지우고... 이런 식으로. (정답)

 


 

8/23. 좌표 정렬하기 (백준 11650번)

 

https://www.acmicpc.net/problem/11650

 

#python

import sys

n = int(sys.stdin.readline())
data = []

for i in range (0, n) :
    a, b = map(int, sys.stdin.readline().split())
    data.append([a, b])

data.sort()

for i in range (0, n) :
    print(data[i][0], data[i][1])

 

2차원 리스트에 값들을 넣고 정렬만 해주면 되는 문제이다. 파이썬 내장 함수 sort를 2차원 리스트에 쓰면 기본으로 0번째 인덱스를 오름차순 정렬해주고 같은 값의 경우 오름차순으로 재정렬을 시켜준다. 고로 이 문제에서는 sort를 그대로 사용하면 된다. 내림차순으로 정렬해야 하는 경우에는 reverse=True를 사용하면 되고 정렬기준을 다르게 하려면 key를 활용하면 된다. (정답) 이로써 class 2 달성과 동시에 실버2로 승급!!

 


 

8/24. 스택 (백준 10828번)

 

https://www.acmicpc.net/problem/10828

 

#python

import sys

class Stack :
    def __init__(self) :
        self.items = []
    
    def push(self, item) :
        self.items.append(item)

    def pop(self) :
        if not self.isEmpty() :
            return self.items.pop()
        else :
            return -1
    
    def peek(self) :
        if not self.isEmpty() :
            return self.items[-1]
        else :
            return -1

    def isEmpty(self) :
        return not self.items

    def size(self) :
        return len(self.items)
    
    def clear(self) :
        self.items = []

stk = Stack()
n = int(sys.stdin.readline())
count = 0

for i in range(0, n) :
    commend = sys.stdin.readline().split()

    if commend[0] == "push" :
        stk.push(commend[1])
    elif commend[0] == "pop" :
        print(stk.pop())
    elif commend[0] == "size" :
        print(stk.size())
    elif commend[0] == "empty" :
        if stk.isEmpty() :
            print(1)
        else :
            print(0)
    elif commend[0] == "top" :
        print(stk.peek())
    
    count += 1

 

내가 따로 티스토리 글로 올린 <파이썬으로 스택 구현>에 있는 코드를 조금 수정해서 문제를 풀었다. 참고! 문자열.split()은 문자열을 띄어쓰기, 엔터로 구분하여 나누게 된다. 그러니 마지막에 입력되는 엔터로 없어지기 때문에 편하다!! (정답)

 


 

8/25. 큐 (백준 10845번)

 

https://www.acmicpc.net/problem/10845

 

#python

import sys

class Queue :
    def __init__(self) :
        self.items = []
    
    def push(self, item) :
        self.items.append(item)

    def pop(self) :
        if not self.isEmpty() :
            object = self.items[0]
            self.items = self.items[1:]
            return object
        else :
            return -1
    
    def front(self) :
        if not self.isEmpty() :
            return self.items[0]
        else :
            return -1
    
    def back(self) :
        if not self.isEmpty() :
            return self.items[-1]
        else :
            return -1

    def isEmpty(self) :
        return not self.items

    def size(self) :
        return len(self.items)
    
    def clear(self) :
        self.items = []

que = Queue()
n = int(sys.stdin.readline())
count = 0

for i in range(0, n) :
    commend = sys.stdin.readline().split()

    if commend[0] == "push" :
        que.push(commend[1])
    elif commend[0] == "pop" :
        print(que.pop())
    elif commend[0] == "size" :
        print(que.size())
    elif commend[0] == "empty" :
        if que.isEmpty() :
            print(1)
        else :
            print(0)
    elif commend[0] == "front" :
        print(que.front())
    elif commend[0] == "back" :
        print(que.back())
    
    count += 1

 

파이썬에 큐 라이브러리가 있다고 해서 리스트 말고 그걸 활용해보려고 했는데 (그게 더 효율적이라고 한다. 리스트로 구현하려면 pop 할 때 리스트 전체를 옮겨야 하니...) 뜻대로 되지 않아... 포기... 더 성장하고 다시 도전해봐야 겠다. 암튼 스택처럼 리스트로 큐 클래스를 구현해서 풀었다. (정답)

 

Comments