일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 데이터공모전
- 교환학생
- 아셈듀오 선정
- 교환학생 장학금
- 제네바
- 파이썬
- 데이터 분석 포트폴리오
- 리뷰분석
- 데이터 포트폴리오
- 제네바경영대학교
- 패스트캠퍼스 #자료구조 #코딩테스트 #배열
- 텍스트분석 시각화
- HEG
- 데이터 시각화 포트폴리오
- 공모전후기
- 키워드시각화
- CRM
- MairaDB
- 두잇알고리즘코딩테스트
- 제네바기숙사
- 교환학생주거
- 태블로
- tableau
- 테이블계산
- 태블로 포트폴리오
- 미래에셋 공모전
- 무신사 데이터분석
- 아셈듀오 후기
- 제네바주거
- 아셈듀오
- Today
- Total
민듀키티
[4월 - 코딩테스트] 스택, 큐 문제 풀이 모음 본문
내가 풀이한 방법 // 나중에 복습하기 위해 코드를 정리
1. 프로그래머스 올바른 괄호
https://school.programmers.co.kr/learn/courses/30/lessons/12909
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
방법 1 : 딕셔너리 활용하기
- str_dict = { "(" : 1, ")" : -1} 을 만들어서, 최종의 합계가 0일 될 경우 True을 리턴
- 그러나 예외상황 발생 : )()( 과 같이 ) 가 먼져오는 경우, 따라서 current value 값에서 마이너스가 되는 경우에는 ( = 닫힘 기호가 먼저 나오는 경우) 에는 False 를 리턴해줌
# 딕셔너리 활용하기
str_dict = { "(" : 1, ")" : -1}
def solution(s) :
current_value = 0
for i in s :
current_value += str_dict[i]
if current_value < 0 :
return False
if current_value == 0 :
return True
방법 2 : 스택 활용하기
- 여는 괄호가 나오면 스택에 추가, 닫는 괄호가 나오면 stack에서 제거
- 그러나, 닫는 괄호 pop 하는 경우, stack에 저장된 것이 하나도 없으면 False 를 리턴. 이 말은 닫는 괄호가 더 많다는 의미
def solution(s) :
stack = []
for ch in s :
if ch == "(" :
stack.append(ch)
else :
if not stack :
return False
stack.pop()
return not stack
2. 프로그래머스 같은 숫자는 싫어
https://school.programmers.co.kr/learn/courses/30/lessons/12906
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 이전의 숫자와 현재의 숫자가 다르면, stack 에 추가 / 혹은 스택에 비어있으면 stack에 추가
- 이전의 숫자와 현재의 숫자가 같으면
def solution(arr):
stack = []
stack.append( arr[0] )
for i in arr :
if i != stack[-1] or len(stack) == 0:
stack.append(i)
else :
stack.pop
return stack
3. 프로그래머스 기능개발
https://school.programmers.co.kr/learn/courses/30/lessons/42586
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
# 기능 개발
import math
def solution(progresses, speeds):
left_time = list()
n = len(progresses)
# 남은 시간 리스트 생성
for i in range(n):
left_time.append(math.ceil((100 - progresses[i]) / speeds[i]))
front = left_time[0]
answer = []
count = 1
for i in range(1,len(progresses)) :
if front >= left_time[i] :
count += 1
else :
front = left_time[i]
answer.append(count)
count = 1
answer.append(count)
return answer
4. 백준 제로
https://www.acmicpc.net/problem/10773
n = int(input())
A = list()
for i in range(n) :
A.append(int(input()))
stack = []
for i in range(n) :
if A[i] != 0 :
stack.append(A[i])
else :
stack.pop()
sumnumber = sum(stack)
print(sumnumber)
5. 백준 괄호
https://www.acmicpc.net/problem/9012
- 위의 프로그래머스 괄호 문제와 똑같이 괄호를 판별하는 함수를 만들어줌
m = int(input())
def check(parst) :
stack = []
for ch in parst :
if ch == "(" :
stack.append(ch)
else :
if not stack :
return False
stack.pop()
return not stack
for i in range(m) :
answer = check(input())
if answer == False :
print("NO")
else :
print("YES")
6. 백준 요세푸스 문제
- deque 를 활용해서 푸는 문제
- 마지막 출력값 형태가 리스트 형태가 아니라 <> 형태라 replace 형태로 형식을 바꿔줘야함
from collections import deque
n,m = map(int, input().split())
myQueue = deque()
for i in range(n) :
myQueue.append(i+1)
return_list = list()
while len(myQueue) > 0 :
for j in range(m-1) :
myQueue.append(myQueue.popleft())
return_list.append(myQueue.popleft())
j = 0
print(str(return_list).replace('[','<').replace(']','>'))
7. 백준 카드 2
- 큐를 이용해서 문제를 해결
- popleft을 이용하여 맨 앞장의 카드 버리기
- 위의 과정 바로 다음으로 popleft -> append를 수행하여 맨 앞에 있는 카드를 가장 아래로 옮기기
- 큐의 크기가 1이 될 때까지 ( while len(myQueue) > 1 ) 남은 원소 출력
from collections import deque
n = int(input())
myQueue = deque()
for i in range(n) :
myQueue.append(i+1)
while len(myQueue) > 1 :
myQueue.popleft()
myQueue.append(myQueue.popleft())
print(myQueue[0])
8. 프로그래머스 짝지어 제거하기
- 실수한 이유 : 다짜고자 s[i] == stack[-1] 조건 여부를 따짐 -> 처음에는 stack이 비워져 있을 것임
- 따라서, if not stack ~ 일 경우의 조건을 먼저 해줘야 함
https://school.programmers.co.kr/learn/courses/30/lessons/12973
def solution(s):
stack = []
for i in range(len(s)) :
if not stack :
stack.append(s[i])
else :
if s[i] == stack[-1] :
stack.pop()
else :
stack.append(s[i])
if stack : return 0
else : return 1
9. 백준 덱2
- 맨 앞에 len(MyQueue) 을 변수로 정의했으면 더 짧고 깔끔하게 풀 수 있었을 듯 하다.
https://www.acmicpc.net/problem/28279
import sys
from collections import deque
N = int(input())
MyQueue = deque()
for i in range(N) :
A = sys.stdin.readline().strip()
if A[0] == '1' :
i,m = A.split()
MyQueue.appendleft(m)
if A[0] == '2' :
i,m = A.split()
MyQueue.append(m)
if A[0] == '3' :
if len(MyQueue) == 0 :
print(-1)
else :
print(MyQueue.popleft())
if A[0] == '4' :
if len(MyQueue) == 0 :
print(-1)
else :
print(MyQueue.pop())
if A[0] == '5' :
print(len(MyQueue))
if A[0] == '6' :
if len(MyQueue) == 0 :
print(1)
else :
print(0)
if A[0] == '7' :
if len(MyQueue) == 0 :
print(-1)
else :
print(MyQueue[0])
if A[0] == '8' :
if len(MyQueue) == 0 :
print(-1)
else :
print(MyQueue[-1])
10. 백준 스택 2
https://www.acmicpc.net/problem/28278
import sys
N = int(input())
stack = []
for i in range(N) :
inputnumber = sys.stdin.readline().strip()
sizestack = len(stack)
number = inputnumber[0]
if number == '1' :
stack.append(int(inputnumber.split()[1]))
elif number == '2' :
if sizestack == 0 :
print(-1)
else : print(stack.pop())
elif number == '3' :
print(len(stack))
elif number == '4' :
if sizestack == 0 : print(1)
else : print(0)
elif number == '5' :
if sizestack == 0 :
print(-1)
else : print(stack[-1])
'Coding Test > Python' 카테고리의 다른 글
[240503] 코딩테스트 문제풀이 (0) | 2024.05.03 |
---|---|
[240502] 코딩테스트 문제풀이 (0) | 2024.05.03 |
[4월 - 코딩테스트] 조합론 문제풀이 모음 (0) | 2024.05.02 |
[4월 - 코딩테스트] 정수론 문제모음 (0) | 2024.05.02 |
[4월 - 코딩테스트] 그리디 문제 풀이 모음 (0) | 2024.05.02 |