2024.12.14 - [Computer Science/자료구조 & 알고리즘] - [자료구조 & 알고리즘] 자료구조 개념 총정리 (향후 내용추가)
[자료구조 & 알고리즘] 자료구조 개념 총정리 (향후 내용추가)
1. 선형 리스트 (Linear List)설명: 데이터를 연속된 메모리 공간에 저장하며, 순서를 보장하는 자료구조.특징:인덱스를 통해 O(1) 시간 복잡도로 접근.삽입/삭제는 O(n)로 비효율적.필수 알고리즘:이
rnasterofmysea.tistory.com
BOJ_12789_도키도키 간식드리미
1. 문제 설명
백준 12789 - 도키도키 간식드리미 문제는 간식을 순서대로 나눠주는 상황을 시뮬레이션하는 문제입니다. 줄을 서 있는 사람들에게 번호가 있고, 간식을 받을 때 반드시 1번, 2번, 3번, ..., N번 순서로 간식을 받아야 합니다.
줄의 순서대로 간식을 줄 수 없을 경우, 임시로 스택에 보관할 수 있지만 규칙을 어기면 "Sad"를 출력해야 합니다.
2. Checkpoint
알고리즘 문제를 C언어로 풀다가 python에 적응하기 위해 다시 스택부터 구현 중이나,
STL의 활용이나 간소화된 문법에 적응하지 못하고 C언어로 다 푼다음에 python으로 옮겨서 풀었습니다...
그마저 ChatGPT의 답안과 거리가 멀었는데, 이유는 즉슨,
C언어의 배열 활용을 그대로 가져와서 리스트의 pop과 apeend 함수만 적용해 python 코드로 변환한 제 코드와 달리,
ChatGPT는 STL을 활용해 줄을 queue 형태로, 임시 대기 장소를 list(stack) 로 처리하였습니다.
python에 deque, queue에 대한 STL을 모르고 있던지라 해당 내용을 따로 학습할 계획입니다.
하단의 설명은 Chatgpt의 답안대로 설명하되, 최하단에는 제가 구현한 코드를 별도 첨부하겠습니다.
알고리즘의 흐름은 동일합니다.
+ 상단의 노란색 줄은 STL을 활용한 것이며, 파란색 줄은 제 코드 실행결과입니다.
문제 접근 방법
- 줄을 관리하기 위해 큐(queue)를 사용합니다.
- 임시 대기 장소로 스택(stack)을 활용합니다.
- 현재 간식을 받을 순서와 비교하여 다음과 같은 방식으로 처리합니다.
- 줄에서 간식을 받을 차례가 맞으면 간식을 줍니다.
- 차례가 맞지 않으면 스택에 대기시킵니다.
- 스택에서 대기 중인 사람이 받을 순서가 되면 스택에서 간식을 줍니다.
- 모든 사람이 순서대로 간식을 받으면 "Nice"를 출력하고, 순서를 지킬 수 없으면 "Sad"를 출력합니다.
3. 코드 구현
from collections import deque
# 입력 처리
N = int(input())
line = deque(map(int, input().split()))
# 변수 초기화
stack = []
current = 1 # 현재 간식을 받을 순서 번호
# 시뮬레이션 시작
while line or stack:
# 줄에서 간식을 받을 수 있는 경우
if line and line[0] == current:
line.popleft()
current += 1
# 스택에서 간식을 받을 수 있는 경우
elif stack and stack[-1] == current:
stack.pop()
current += 1
# 줄에서 간식을 받을 수도, 스택에서 받을 수도 없는 경우
else:
if line:
stack.append(line.popleft())
else:
break
# 결과 출력
if current > N:
print("Nice")
else:
print("Sad")
4. 코드 설명
- 변수 및 데이터 구조 초기화
- line: 줄에 서 있는 사람들의 번호를 저장하는 큐입니다.
- stack: 임시로 대기하는 사람들을 저장하는 스택입니다.
- current: 현재 간식을 받을 순서 번호입니다.
- 반복문 실행
- 줄에서 간식을 받을 순서가 맞으면 바로 간식을 줍니다.
- 줄에서 간식을 줄 수 없을 경우 해당 사람을 스택에 넣어 대기시킵니다.
- 스택의 맨 위에 있는 사람이 받을 차례가 되면 간식을 줍니다.
- 결과 출력
- 모든 사람이 순서대로 간식을 받았다면 "Nice"를 출력합니다.
- 중간에 순서가 꼬여 간식을 줄 수 없으면 "Sad"를 출력합니다.
5. 예제 입력 및 출력
예제 입력 1
5
1 2 5 3 4
예제 출력 1
Nice
예제 입력 2
5
1 2 4 3 5
예제 출력 2
Sad
6. (별도) STL 없이 구현한 코드
N = int(input())
arry = list(map(int, input().split()))
start = 0
stack = []
for i in range(1,N):
target = i
temp = 0
for j in range(start, N):
if target != arry[j] :
stack.append(arry[j])
else:
start = j+1
temp = 1
break
if temp == 0:
while(stack):
if target != stack[-1]:
stack.pop()
else:
temp = 1
break
if temp == 0:
print("Sad")
exit()
print("Nice")
💡 도움이 되셨다면 댓글과 공감 부탁드립니다! 😊
📌 더 많은 알고리즘 풀이와 프로그래밍 자료는 블로그에서 확인하세요!
✉️ 문의나 피드백은 댓글이나 이메일로 남겨주세요.
'Computer Science > 알고리즘 문제' 카테고리의 다른 글
C - [Backjoon 18869] 멀티버스 II (feat. 이분탐색, 좌표압축) (0) | 2025.02.08 |
---|---|
C - [백준 18870] 좌표 압축 (feat. 이분탐색, 퀵정렬) (0) | 2025.02.07 |
★ C - [백준 2295] 세 수의 합 (feat. 이분탐색) (0) | 2025.02.06 |
C - [백준 1931] 회의실 배정 (feat. 그리디, 퀵 정렬) (0) | 2025.02.05 |
C - [백준 2217] 로프 (feat. 그리디, 퀵 정렬) (0) | 2025.02.04 |