은공지능 공작소 :: '파이썬 알고리즘' 태그의 글 목록
반응형

안녕하세요. 은공지능 공작소의 파이찬입니다.
프로그래머스의 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

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

,
반응형

안녕하세요. 은공지능 공작소의 파이찬입니다.
오늘부터 프로그래머스 파이썬 알고리즘 문제풀이를 하나씩 올려보려고 합니다.
거의 2년 반 만의 포스팅이네요... 이전 회사에서 너무 바쁜 나날들을 보냈습니다.

오늘 풀어볼 문제는 "로그인 성공?" 이라는 문제입니다.

 

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

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

 

프로그래머스

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

programmers.co.kr

 

 

 

 

1. for문을 이용하여 input parameter 하나씩 살펴보기

 

def solution(id_pw, db):
    for id, pw in db:
        print(id, pw)
output
----------------------------
rardss 123
yyoom 1234
meosseugi 1234
아이디와 비밀번호가 각각 for문의 id, pw라는 변수에 담겼습니다.
먼저 db에 담긴 내용을 살펴보겠습니다.
현재 test case1에 대해서만 출력을 해보았는데, 결과는 위와 같습니다.

 

 

 

2. if 문으로 분기 나누기

 

그 다음으로 생각해 봐야 하는 것은 if 문으로 분기를 나누는 것입니다.
id와 pw를 비교해야 하는데, 어떤 것을 더 상위의 if문으로 둘 것인지 생각해봐야 합니다.

만약 id가 일치하는 회원이 없다면?
그냥 "fail"을 return해주고 종료하면 됩니다.
id가 틀렸는데 pw를 굳이 또 체크할 필요가 있을까요? 그럴 필요는 없습니다 ㅎㅎ

id가 일치하는 회원이 있다면, 여기서 또 분기를 2개로 나눠야 합니다.
① pw가 일치할 경우 -> "login"을 return
② pw가 일치하지 않을 경우 -> "wrong pw"를 return
def solution(id_pw, db):
    for id, pw in db:
        if id_pw[0] == id:
            if id_pw[1] == pw:
                return "login"
            else:
                return "wrong pw"
    return "fail"

 

★ 체크포인트① ★
list indexing을 이용한 id_pw 접근
id_pw는 대괄호로 묶여있는 자료구조로, 이러한 것을 python에선 list라고 부릅니다.
list의 각 요소에 접근하기 위한 방법을 indexing이라고 부르는데요,
대괄호 안의 숫자로 각 요소에 접근할 수 있습니다. (ex- id_pw[0])

+ Python index의 시작 번호는 1번 부터가 아닌 0번 부터입니다.
그러므로 id_pw[0]이라고 하는 것은, 리스트의 첫 번째 요소에 접근한다는 뜻 입니다.
id_pw = ["meosseugi", "1234"]
현재 id_pw라는 리스트는 위와 같이 구성되어 있습니다.
그러므로 id_pw[0]을 사용하면, "meosseugi"라는 id값에 접근하게 됩니다.
마찬가지 원리로 id_pw[1]는 리스트의 두 번째 요소를 가리키며,
"1234"라는 값을 반환합니다.

 

 

 

def solution(id_pw, db):
    for id, pw in db:
        if id_pw[0] == id:
            if id_pw[1] == pw:
                return "login"
            else:
                return "wrong pw"
    return "fail"
★ 체크포인트② ★
return 명령어를 활용한 함수 즉시 종료
return 명령어는 함수를 즉시 종료합니다.
해당 함수는 solution이라는 이름을 갖고 있습니다.

그러므로 위 코드를 풀이해보면,
하나라도 id와 pw가 맞는 경우가 있다면 바로 "login"을 return하고
함수가 종료된다는 뜻입니다.

만약 for문이 종료될 동안 하나도 if문에 걸리는게 없다면 어떨까요?
맨 마지막 구문인 return "fail"까지 도달하게 됩니다.
이 경우, 입력한 id와 일치하는 것이 db에 없다는 말이 되겠습니다.

 

 

 

3. 핵심 정리

해당 문제를 풀기위해 필요한 개념입니다.

ⓐ 자료구조 list에 대한 이해 (indexing 개념 포함)
for 반복문,
if 분기문
+ return을 활용한 함수 즉시 종료

해당 문제는 파이썬의 기초을 잘 알고 계신 분이라면,
무난하게 풀 수 있었던 문제라고 생각됩니다.
기초를 탄탄히 다지는 것은 언제나 중요합니다!

감사합니다.
반응형
블로그 이미지

pychan

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

,