인프런 커뮤니티 질문&답변
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:
없음




