주녘공부일지

[프로그래머스 C#] Lv.2 택배상자 본문

Programmers - C#/CodingTest Lv.2

[프로그래머스 C#] Lv.2 택배상자

주녘 2023. 12. 30. 19:14
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/131704#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 정답코드 및 핵심 아이디어, 유의사항

이해만 잘 한다면 굉장히 직관적인 문제로, 문제를 잘 이해하는 것이 중요함

- 주어진 order는 순서대로 넣어야 하는 순서임

- 보조 컨테이너 벨트는 stack과 동일한 동작을 함 ( 후입선출 )

- 택배 상자는 1번부터 순서대로 n개가 존재하고 순서대로 뺴올 수 있음 ( 마치 queue처럼 ) 

 -> 빼온 택배 상자는 order에 맞으면 넣고, 아니면 보조 컨테이너 벨트(stack)에 넣어야 함

  -> 이 때, 만약 보조 컨테이너 벨트에서 컨테이너 벨트로 넣을 수 있다면 넣고 다시 확인

      ( 컨테이너 벨트에 넣어야 할 번호가 갱신되므로 )

 

주석 참조

    using System;
    using System.Collections.Generic;

    public class Solution
    {
        public int solution(int[] order)
        {
            int answer = 0; // order[answer] : 컨테이너 벨트에 실어야 할 번호
            var stack = new Stack<int>(); // 보조 컨테이너 벨트
            
            // 1번 ~ 마지막 택배 상자까지 컨테이너 벨트 or 보조 컨테이너 벨트에 담음
            for (int i = 1; i <= order.Length; i++)
            {
                if (i == order[answer])
                {
                    // 컨테이너 벨트에 넣음
                    answer++;
                }
                else if (stack.Count > 0 && stack.Peek() == order[answer])
                {
                    // 보조 컨테이너 벨트 -> 컨테이너 벨트
                    stack.Pop();
                    answer++;
                    i--;
                }
                else
                {
                    // 보조 컨테이너 벨트에 넣음
                    stack.Push(i);
                }
            }
            
            // 보조 컨테이너 벨트 -> 컨테이너 벨트로 넣을 수 있다면 계속 넣음
            while (stack.Count > 0 && stack.Peek() == order[answer])
            {
                answer++;
                stack.Pop();
            }
            
            return answer;
        }
    }
728x90