반응형
안녕하세요. 은공지능 공작소의 파이찬입니다.
프로그래머스의 lv.0 컨트롤제트 문제 풀어보도록 하겠습니다.
문제 바로가기 ↓↓↓ 하단 링크 클릭
https://school.programmers.co.kr/learn/courses/30/lessons/120853
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의 용법 이해하기
이상 포스팅을 마치겠습니다!
하트 한번씩 눌러주세요~!
감사합니다.
반응형
'Python > 알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 기사단원의 무기 파이썬 알고리즘 문제풀이 (약수의 개수 구하기) (0) | 2022.12.08 |
---|---|
[프로그래머스] 유한소수 판별하기 파이썬 문제 풀이 #유클리드 호제법 #소인수분해 (0) | 2022.11.29 |
[프로그래머스] 햄버거 만들기 파이썬 알고리즘 문제 풀이 (0) | 2022.11.28 |
[프로그래머스] 문자열을 정수로 바꾸기 Python 풀이법 (0) | 2022.11.22 |
[프로그래머스] 로그인 성공? 알고리즘 문제풀이 (0) | 2022.11.17 |