강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

김기수님의 프로필 이미지
김기수

작성한 질문수

38군데 합격 비법, 2025 코딩테스트 필수 알고리즘

3-6. 큐

1874 - 스택 문항

해결된 질문

작성

·

32

0

1. 현재 학습 진도

  • 3강까지 진도를 나간상태입니다.

 

2. 어려움을 겪는 부분

  • 코드 효율성에 대해서 아직 감이 없어서 질문을 남기고자 합니다! 

  • 질문 문항은 추가문제인 1874 - 스택 문항입니다

    def stack_sequence(n, sequence):
    

3. 시도해보신 내용

  • 우선 제가 작성한 코드부터 보여드리겠습니다.

  •  

    def stack_sequence(n, sequence):
        # 이 곳을 채워보세요!
        stack_sequence = []
        k = 0
        push_pop = []
        for i in range (1, n+1):
            stack_sequence.append(i)
            push_pop.append('+')
            while stack_sequence and stack_sequence[-1] == sequence[k]:
                stack_sequence.pop()
                push_pop.append('-')
                k += 1
    
        if stack_sequence != []:
            print("NO")
            return
            
    
        for char in push_pop:
            print(char)
            
        return
  • 선생님의 필기에 있는 코드와 다르게 수행가능한 조건을 전부 수행 -> 반복문 종료이후 종료 조건이면 return / 아니면 정답!

  • 흐름으로 구성했습니다.

  • 발상에 있어서 생각의 흐름? 대로 코드를 작성했다고 생각하는데 필기의 코드처럼 하나의 반복문내에서 특정 조건 -> 탈출 하도록 하는게 더 바람직한 코드일까요?

  • 코드에 정답은 없다고 하셨지만 계속 코드를 작성하다보니 생각의 흐름대로만 작성하는것 같아서 앞으로 코드를 작성할때 발상을 더 견고히 하고 코드를 짜야하는지,, 감이 잘안서서 질문을 남깁니다.

  • 항상 감사드립니다!

이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다! 😊

답변 2

0

딩코딩코님의 프로필 이미지
딩코딩코
지식공유자

안녕하세요 기수님 좋은 질문 감사드립니다!!! 코드 효율성뿐 아니라 "사고의 흐름과 코드 구조"에 대한 고민까지 하시는 거 넘넘 좋습니다!!

1. 두 코드의 핵심 차이점

작성해주신 코드와 강의 코드의 가장 큰 차이는 "언제 종료 조건을 체크하느냐"입니다.

공유해주신 코드는 1부터 n까지 순차적으로 push하면서 가능한 만큼 pop을 수행하고, 반복문이 끝난 뒤에 스택이 비어있는지 확인하는 방식이에요. 반면 강의 코드는 while True 안에서 매 상황마다 조건을 분기해서 불가능한 순간에 바로 탈출하는 방식이죠.

재밌는 건, 두 방식 모두 시간복잡도는 O(N)으로 동일합니다. 숫자는 최대 한 번씩 push되고 한 번씩 pop되니까요.

 

2. 생각의 흐름대로 코드 짜는 것, 괜찮을까요?

결론부터 말씀드리면, 전혀 문제없어요. 오히려 초반에는 이게 더 좋은 습관입니다.

코딩테스트에서 가장 중요한 건 정해진 시간 안에 정확하게 동작하는 코드를 작성하는 거예요. 본인의 사고 흐름대로 코드를 짜서 정답이 나온다면, 그게 가장 안정적인 방법입니다. 면접관이 코드 스타일을 채점하는 게 아니거든요.

공유해주신 코드처럼 "일단 다 처리하고 → 마지막에 검증"하는 패턴은 실수가 적고 디버깅도 쉬워요. 강의 코드처럼 중간에 break하는 패턴은 익숙해지면 효율적이지만, 조건 분기가 복잡해지면 실수하기 쉽습니다.

 

3. 그럼 언제 발상을 더 견고히 해야 할까요?

시간 초과나 메모리 초과가 발생했을 때, 그때 구조를 다시 고민하면 됩니다. 문제를 풀다 보면 "이건 O(N²)으로는 안 되겠다"는 상황이 분명 생기는데, 그때 최적화를 고민해도 늦지 않아요.

지금처럼 본인만의 일관된 패턴으로 문제를 풀 수 있다면, 그 패턴을 믿고 가셔도 됩니다. 다양한 문제를 풀다 보면 자연스럽게 "아, 이 상황에서는 이렇게 짜는 게 더 깔끔하겠다"는 감이 생겨요.

 

넘넘 잘하고 계십니다!! 이상태로 꾸준히 연습하시길 응원하겠습니다 좋은 하루 보내세요!!

0

안녕하세요, 인프런 AI 인턴입니다.
김기수님께서 작성해주신 코드에 대해 피드백을 드리도록 하겠습니다.

우선, 알고리즘 문제를 푸실 때 중요한 것은 가독성과 효율성입니다. 현재 작성하신 코드는 가독성이 높은 편입니다. 이는 코드의 흐름이 명확하고, 각 연산의 의미가 잘 드러나기 때문입니다.

그러나 효율성 측면에서는 한 번 더 고민해 볼 부분이 있을 것 같습니다. 효율성을 높이기 위해서는 코드에서 불필요한 연산을 줄이는 것이 중요합니다. 예를 들어, stack_sequence != [] 검사를 사용하여 비어있는지 확인하는 부분을 if stack_sequence:로 간결하게 표현할 수 있으며, 이는 실행 속도 개선에도 기여합니다.

또한, 문제에 관련된 모든 조건이 여러 개의 반복문과 조건문에 나뉘어 처리되는 대신, 한 번의 순회를 통해 해결할 수 있는지 고려해 보세요. 그리고 반복문 내부에서 지나치게 많은 작업을 수행하지 않도록 주의가 필요합니다.

마지막으로 코드 작성 시 주의점은 “구체성을 추구하면서도, 일반화된 패턴을 찾아 효율성을 높이는 것”입니다. 즉, 코드를 작성할 때는 현재의 흐름을 잘 기억하시되, 다소 반복적일 수 있는 패턴을 찾아 이를 줄일 수 있는 방법도 계속 연구해 보세요.

앞으로 코드를 계속 작성하시면서, 다양한 문제 상황을 경험하고 코드 작성을 반복하면 점차 감이 잡히실 것입니다. 고민이 있을 때마다 이렇게 질문 남겨주시면 도움 드릴 수 있도록 노력하겠습니다. 감사합니다.

이미지 URL:
없음

출처:
https://www.inflearn.com/faq

김기수님의 프로필 이미지
김기수

작성한 질문수

질문하기