강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của gisu11028193
gisu11028193

câu hỏi đã được viết

Bí quyết đỗ 38 nơi, các thuật toán bắt buộc cho kỳ thi Coding Test 2025

3-6. Hàng đợi (Queue)

1874 - 스택 문항

Đã giải quyết

Viết

·

69

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 / 아니면 정답!

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

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

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

  • 항상 감사드립니다!

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

python코딩-테스트알고리즘data-structure

Câu trả lời 2

0

dingcodingco님의 프로필 이미지
dingcodingco
Người chia sẻ kiến thức

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

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

Hình ảnh hồ sơ của gisu11028193
gisu11028193

câu hỏi đã được viết

Đặt câu hỏi