12789번- 도키도키 간식드리미

의혁·2024년 12월 26일
0

[Algorithm] 알고리즘

목록 보기
1/50
post-thumbnail

💡 다시 코테스터디도 시작했고, 스터디 내의 다른 분들의 코드 풀이 방식도 리뷰하기 위해서 작성해 보도록 하자!!

stack을 이용해서 풀이하였다.

import sys

T = int(sys.stdin.readline())

stack = []
array = list(map(int, sys.stdin.readline().split(' ')))
curr = 1

while(True):
    
    # 양쪽 모두 번호가 있는 경우
    if stack and array:
        if array[0] != curr and stack[-1] != curr:
            stack.append(array[0])
            array.pop(0)    
        elif array[0] == curr:
            array.pop(0)
            curr += 1
        elif stack[-1] == curr:
            stack.pop()
            curr += 1
    elif not stack and array:
        if array[0] != curr:
            stack.append(array[0])
            array.pop(0)
        elif array[0] == curr:
            array.pop(0)
            curr += 1
    elif not array and stack:
        if stack[-1] == curr:
            stack.pop()
            curr += 1
        else:
            break
    elif not stack and not array:
        break


# 어짜피 array는 비어지게 된다. (12/30 피드백)
# if not stack and not array:
if not stack:
    print("Nice")
else:
    print("Sad")
  • 처음에는 되게 간단한 문제다 라고 생각을 해서, 기존의 줄서는 부분과 빠지는 쪽의 줄서는 부분 모두를 고려하지 않다보니, 예제 코드에서는 통과해서 넣어봤지만 정확히 16%에서 "틀렸습니다"가 발생하였다
  • stack을 고려해볼 뿐만 아니라, stack이 비었을때, array가 비었을때, 둘 다 차있을 때, 둘 다 비었을 때 모두 조건을 걸어서 확인할 필요가 있었다.
  • pop()를 활용하여, 가장 끝부분을 pop 할때는 pop()을 사용하고, 해당 내부 index 중에 하나를 pop 할 경우에는 pop(i)를 사용해 주었다.

오프라인 코테 스터디 (12/30)
참가 인원: 기우석님

  • 풀이 방식
for (int i = 0; i < n; i++) {
        // 현재 번호가 순서와 맞다면 바로 간식을 받음
        if (arr[i] == cur_value) {
            cur_value++;
        }
        else {
            // 스택이 비어있지 않으며 스택 맨 위가 순서에 맞는 경우 처리
            while (!stk.empty() && stk.top() == cur_value) {
                stk.pop();
                cur_value++;
            }
            // 현재 번호를 스택에 삽입
            stk.push(arr[i]);
        }
    }
    // 남은 스택 처리
    while (!stk.empty()) {
        if (stk.top() == cur_value) {
            stk.pop();
            cur_value++;
        }
        else {
            break; // 순서가 맞지 않으면 즉시 종료
        }
    }
  • for문 내에서 while을 써서 코드를 줄이시는 방식이 인상깊었다.
profile
매일매일 차근차근 나아가보는 개발일기

0개의 댓글