프로그래머스 파이썬 기초 해석 :: 수 조작하기 1 (* dict 활용)

     

프로그래머스 URL

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



프로그래머스 코딩 카테고리 

코딩 기초 트레이닝

Day 6 조건문, 반복문 - 수 조작하기 1

Lv.0





문제 설명

정수 n과 문자열 control이 주어집니다. control은 "w", "a", "s", "d"의 4개의 문자로 이루어져 있으며, control의 앞에서부터 순서대로 문자에 따라 n의 값을 바꿉니다.

"w" : n이 1 커집니다.

"s" : n이 1 작아집니다.

"d" : n이 10 커집니다.

"a" : n이 10 작아집니다.

위 규칙에 따라 n을 바꿨을 때 가장 마지막에 나오는 n의 값을 return 하는 solution 함수를 완성해 주세요.


n control result
0 "wsdawsdassw" -1



제한 사항

-100,000 ≤ n ≤ 100,000

1 ≤ control의 길이 ≤ 100,000

control은 알파벳 소문자 "w", "a", "s", "d"로 이루어진 문자열입니다.



문제 이해

[입력] 정수 n, 문자열 control (w, a, s, d로 구성됨)  

[출력] 정수 result

[규칙]

w     +1

    -1 

d     +10

a     -10

[조건, 반복] 조건문으로 문자열 확인하고 규칙에 맞춰 값을 저장 



------------------------



내가 푼 풀이

def solution(n, control):
    for i in control: 
        if i == 'w' : n += 1
        elif i == 's': n -= 1
        elif i == 'd': n += 10
        else : n -= 10 
    return n


업그레이드 

1. dict 딕셔너리 활용하기 

dict는 대응하는 값이 있을때 쓰면 유용하다. 
이 문제에서는 문자열 w, s, d, a가 각각 +1, -1, +10, -10 값을 가진다. 
따라서, dict의 key 값을 문자열로 두고, value 값을 숫자로 둘 수 있다. 
최종적으로 구할려는게 숫자이기에, value 값을 숫자로 둠


c = { 'w' : 1, "s" : -1, "d" : 10, "a" : -10 }

def solution(n, control):
    c = { 'w' : 1, "s" : -1, "d" : 10, "a" : -10 }
    for i in control : 
        n += c[i]
    return n 



2. dict + sum() 활용하기

위의 1번에서, 딕셔너리를 for문을 돌리면서 n에 값을 누적시켰다. 


for i in control : 
    n += c[i]          

이거를 간결하게 표현하기 위해서 한 줄 for문인 리스트 컴프리헨션을 해봤지만, 불가능하다


n += c[i] for i in control #불가능 

SyntaxError: invalid syntax 오류뜸

리스트 컴프리헨션으로 n 값을 누적시키는 것은 불가능하다. 


이를 대체한 방법이 sum 함수이다. 

파이썬 내장함수로, iterable 객체의 값을 합치는 기능을 한다. 

n += sum(c[i] for i in control)


def solution(n, control):
    c = { 'w' : 1, "s" : -1, "d" : 10, "a" : -10 }
    return n + sum(c[i] for i in control)          


dict 랑 sum()을 활용한 두번째 완성 코드가 이렇게 만들어진다. 



3. dict + eval () 활용하기  

def solution(n, control):
    c = {'w' : "1" , 's' : "-1", 'd' : "10", 'a' : "-10"}
    return eval("+".join(c[i] for i in control)) + n          




4. array.count(x) 활용하기  

파이썬 공식문서 - count 메서드


빈 dict를 선언하고, control 문자열에 있는 각 문자의 회수를 value 값으로 추가하는 방법 

dict의 특정 value 값을 알고싶을때는, dict[key] 

dict에 값을 추가할려고 할때는 아래처럼, dict[key1] = value1 


def solution(n, control):
    c = {}
    c['w'] = control.count('w')
    c['s'] = control.count('s')
    c['d'] = control.count('d')
    c['a'] = control.count('a')
    return n + c['w'] - c['s'] + 10*c['d'] - 10*c['a']          



이 방법과 동일하지만, 딕셔너리에 값을 넣지않고 바로 contol.count 값으로 계산할 수 있다.  
def solution(n, control):
    return n + (control.count('w') - control.count('s')) + 10*(control.count('d') - control.count('a'))     





5. zip() 활용해서, dict 만들기

dict = {'w': 1, 's': -1, 'd': 10, 'a': -10}  이렇게 선언해도 되지만, 

zip 함수로 리스트 두개를 합쳐서, dict로 형변환 해주는 것도 같다. 

c2 = {'w': 1, 's': -1, 'd': 10, 'a': -10}
c = dict(zip(['w','s','d','a'], [1,-1,10,-10]))          


두개의 dict 모두 출력이 {'w': 1, 's': -1, 'd': 10, 'a': -10} 이렇게 동일하다. 


그러면 아래와 같은 완성 코드가 만들어진다. 

def solution(n, control):
    c = dict(zip(['w','s','d','a'], [1,-1,10,-10]))
    return n + sum([c[i] for i in control])          













댓글

이 블로그의 인기 게시물

[KT 에이블스쿨 - IT 트랜드] 국내외 AI 관련 규제

KT 에이블스쿨 : 6-7차 미니프로젝트 - 제안서 기반 솔류션 기획 및 설계

KT 에이블스쿨 : 클라우드 서비스 1일차 정리