은공지능 공작소 :: [프로그래머스] 컨트롤제트 알고리즘 문제풀이
반응형

안녕하세요. 은공지능 공작소의 파이찬입니다.
프로그래머스의 lv.0 컨트롤제트 문제 풀어보도록 하겠습니다.

 

문제 바로가기 ↓↓↓ 하단 링크 클릭

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

 

프로그래머스

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

programmers.co.kr

 

 

 

1. 스택 자료 구조 이해하기

 

스택(stack) 이란, 나중에 들어간 것이 먼저 나오는 (LIFO) 자료구조를 말합니다.
문제 풀이법은 다양하지만, 저는 Stack을 이용하여 해당 문제를 풀었습니다.
자료구조를 이해하는 것은 알고리즘 문제풀이에 많은 도움이 됩니다.

 

 

 

2. 입력값을 숫자와 문자로 구분하기

input_data = "1 2 Z 3"
print('input:', input_data.split())
print()

for data in input_data.split():
    print(data)
output
-------------------------------
input: ['1', '2', 'Z', '3']

1
2
Z
3
먼저 입력 데이터를 살펴봅시다.
위와 같이 split()함수를 이용하면, 공백으로 구분된 문자열을 리스트에 이쁘게 담아줍니다.
출력을 해보면 위와 같이 프린트가 됩니다.

이제 값들을 숫자와 숫자가 아닌 것으로 구분해줘야 합니다.
그 전에 data의 값이 음수가 올 수도 있다는 사실에 주목해야 합니다.
보통 문자열 데이터에서 숫자를 구분하기 위해 isdigit(), isnumeric() 함수를 많이 사용하는데,
이 함수들은 음수값들을 필터링하지 못 합니다.

조건문에 문자열 'Z'만 따로 구분하는 방법도 있겠지만,
저는 좀 더 pythonic한 방법을 사용해보려 합니다.

 

 

 

input_data = "1 -2 Z 3"

for data in input_data.split():
    try:
        num = int(data)
        print('num:', num)
    except:
        print('str:', data)
output
--------------------------------
num: 1
num: -2
str: Z
num: 3
try ~ except 구문을 이용하였고, 음수에도 동작한다는 것을 보여드리기 위해
두 번째 입력값을 2 -> -2로 바꾸었습니다.

try ~ except는 파이썬에서 예외처리를 하기 위해 쓰이는 문법입니다.
try 쪽을 먼저 시도해보고, 에러가 안 난다면 그대로 excpet를 건너뛰고 통과합니다.
만약 try 쪽에서 에러가 난다면, except 쪽으로 빠지게 되는 구조입니다.

위의 코드에서 문자열 'Z'에 int 함수를 씌우려 하니 에러가 발생합니다.
(Exception: invalid literal for int() with base 10: 'Z')
그래서 except 구문이 실행이 되는 원리 입니다.

 

 

 

 

3. Stack 활용하여 자료 넣고 꺼내기

input_data = "1 -2 Z 3"

stack = []
for data in input_data.split():
    try:
        num = int(data)
        stack.append(num)
    except:
        if stack:
            pop_data = stack.pop()
            
    print('stack:', stack)
output
------------------------
stack: [1]
stack: [1, -2]
stack: [1]
stack: [1, 3]
Python List 자료구조를 Stack처럼 활용하였습니다.
데이터가 숫자라면 차례대로 stack에 append 함수를 이용하여 쌓아줍니다.
데이터 'Z'가 들어오면 stack에서 pop 함수를 이용하여, 마지막 것 부터 꺼냅니다.
(pop 함수는 리스트의 맨 뒤 요소를 뽑아내는 기능 수행)

(+) if stack 부분 설명:
stack에 데이터가 있으면 실행한다는 뜻 입니다.
stack이 비어있으면 if문이 실행되지 않습니다.

 

 

 

코드가 실행되는 것을 슬라이드로 표현해 보았습니다.
코드의 output을 이해하시는데 도움이 될 것입니다.

 

 

 

4. 최종 결과 값 계산하기

result라는 변수를 하나 만들고
결과들을 하나씩 더해주거나 빼주도록 하겠습니다.

숫자가 나온다면? -> result에 차례로 더해주고 stack에 쌓으면 됩니다.
'Z'가 나온다면? -> stack에서 하나를 pop한 후, result에서 빼주면 됩니다.
input_data = "1 -2 Z 3"

stack = []
result = 0
for data in input_data.split():
    try:
        num = int(data)
        result += num
        stack.append(num)
    except:
        if stack:
            pop_data = stack.pop()
            result -= pop_data

    print('result:', result)
    
print('--------------')
print('result2:', sum(stack))
output
---------------------------------------
result: 1
result: -1
result: 1
result: 4
--------------
result2: 4
result 결과값은 최종적으로 4가 됩니다.
이는 stack에 남아있는 숫자들을 모두 더한 값과 동일합니다. (result2: 4)
저도 나중에 알았네요 ㅋㅋ result 변수를 안 써도 될 듯 합니다.
최종 풀이는 해당 방법으로 교체하고 result 변수 부분들을 삭제하도록 하겠습니다.

 

 

 

 

5. 프로그래머스 제출용 정답 및 핵심정리

def solution(s):
    stack = []
    for num in s.split():
        try:
            stack.append(int(num))
        except:
            if stack:
                stack.pop()
    return sum(stack)
★핵심 정리

1. Stack 자료구조 이해 (python list 이용)
2. 음수값 처리 방법 -> python try ~ except 구문 이용
3. append와 pop의 용법 이해하기

 

 

 

 

22.11.16 판교제2테크노밸리의 소나무가 참 멋있다!

이상 포스팅을 마치겠습니다!
하트 한번씩 눌러주세요~!
감사합니다.
반응형
블로그 이미지

pychan

딥러닝에 관련된 시행착오, 사소하지만 중요한 것들, 가능한 모든 여정을 담았습니다.

,