프로그래머스 파이썬 기초 해석 :: 수 조작하기 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 함수를 완성해 주세요.
제한 사항
-100,000 ≤ n ≤ 100,000
1 ≤ control의 길이 ≤ 100,000
control은 알파벳 소문자 "w", "a", "s", "d"로 이루어진 문자열입니다.
문제 이해
[입력] 정수 n, 문자열 control (w, a, s, d로 구성됨)
[출력] 정수 result
[규칙]
w +1
s -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 딕셔너리 활용하기
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) 활용하기
빈 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']
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])
댓글
댓글 쓰기