2021년 6월 13일
프로그래머스에서 푼 level1 10문제 모음집입니다.
문제 풀이에 대한 설명은 코드에 주석으로 표시하였습니다.
def solution(dartResult):
answer = 0
# 'S', 'D', 'T'에 대한 제곱수를 미리 사전 자료형에 담아두었다.
sdt = {
'S' : 1,
'D' : 2,
'T' : 3
}
tmp = list()
# iterator
i = 0
while i < len(dartResult):
# 현재 문자가 정수형이라면
if dartResult[i].isdecimal():
# 그런데 한 문자는 한 개의 숫자로 이루어져있어서 10을 처리할 수 없기 때문에 따로 처리
if dartResult[i] == '1' and dartResult[i+1] == '0':
tmp.append(10)
i += 1
else:
# 한자릿수의 숫자는 바로 리스트tmp에 넣는다.
tmp.append(int(dartResult[i]))
# 현재 문자가 알파벳이라면(S,D,T)
elif dartResult[i].isalpha():
tmp[-1] **= sdt[dartResult[i]]
else:
# 현재 문자가 '*'이라면
if dartResult[i] == '*':
if len(tmp) > 1:
tmp[-1] *= 2
tmp[-2] *= 2
# 첫 번째 기회에서 스타상이라면
else:
tmp[-1] *= 2
# 현재 문자가 '#'이라면
elif dartResult[i] == '#':
tmp[-1] *= (-1)
i += 1
# 현재까지 구한 점수 더하기
for i in tmp:
answer += i
return answer
def solution(dartResult):
point = []
answer = []
# 10점을 처리하기 위해서 미리 문자열'10'을 'k'로 대체
dartResult = dartResult.replace('10','k')
point = ['10' if i == 'k' else i for i in dartResult]
print(point)
i = -1
sdt = ['S', 'D', 'T']
for j in point:
if j in sdt :
answer[i] = answer[i] ** (sdt.index(j)+1)
elif j == '*':
answer[i] = answer[i] * 2
if i != 0 :
answer[i - 1] = answer[i - 1] * 2
elif j == '#':
answer[i] = answer[i] * (-1)
else:
answer.append(int(j))
i += 1
return sum(answer)
💡 알게된 문법
- c++에서는 for문의 iterator를 for문 내에서 변경 가능한 것과는 달리, python에서는 불가능하다.
변경하고 나서 당장은 값이 변해있지만, 다시 for문이 돌아가는 시점에서 iterator가 원래 값으로 되돌아온다.# 0 1 2 4가 아닌, # 결과 : 0 1 2 3 4 for i in range(5): print(i, end = ' ') if i == 2: i += 1
def solution(arr, divisor):
answer = []
arr.sort()
for a in arr:
if a % divisor == 0:
answer.append(a)
if not answer:
answer.append(-1)
return answer
def solution(arr, divisor):
answer = []
arr.sort()
# 리스트 컴프리헨션 사용
answer = [x for x in arr if x % divisor == 0]
return answer if answer else [-1]
def solution(a, b):
answer=0
a,b=min(a,b),max(a,b)
for i in range(a,b+1):
answer+=i
return answer
def solution(a, b):
answer = 0
if a>b : a,b = b,a
return sum(range(a,b+1))
range(n)
- 범위 자료형
- return값: <class 'range'> (Immutable sequence type)
- list()함수를 이용해 범위를 리스트로 변경하면 범위 내부에 어떤 값이 들어있는지 확인할 수 있다.
def solution(strings, n):
# 람다 함수를 사용해서, 첫번째 기준: 인덱스 n에 있는 문자, 두번째 기준: 사전에서 앞에 나온 것 순으로
return sorted(strings, key=lambda x: (x[n], x))
def solution(s):
answer = True
if s. count('p')+s.count('P' ) != s. count('y')+s.count('Y') :
answer =False
return answer
-> lower()로 모든 알파벳을 소문자를 만든 후에
s.count('p') != s.count('y')를 하는 방법도 있음!
def solution(s):
answer = ''
# 대문자를 담는 리스트
upper = []
# 소문자를 담는 리스트
lower = []
# 문자열에는 sort()가 없어서 일부로 list로 만들었지만,
# sorted()를 사용해서 정렬할 수 있으니 굳이 list로 만들 필요가 없었다.
s = list(s)
for i in s:
if i.isupper():
upper.append(i)
else:
lower.append(i)
upper.sort(reverse=True)
lower.sort(reverse=True)
answer = ''.join(lower)+''.join(upper)
return answer
💡 문자열 정렬
문자열을 정렬할 때 sorted()함수를 사용하면 된다.
대신 sorted()함수는 list를 리턴하기 때문에 다시 문자열로 만들고 싶다면 join()함수와 같이 사용해야한다.
문자열을 정렬할 때 대문자가 먼저오고 소문자가 나중에 온다!
def solution(s):
return True if (len(s) == 4 or len(s) == 6) and s.isdigit() else False
def solution(s):
return if s.isdigit() and len(s) in (4,6)
def solution(seoul):
return "김서방은 {}에 있다".format(seoul.index("Kim"))
요소의 위치 찾기
1. 문자열 -> find() , rfind()
- find() : 왼쪽부터 찾아서 처음 등장하는 위치를 찾는다.
- rfind() : 오른쪽부터 찾아서 처음 등장하는 위치를 찾는다.
- 찾는 요소가 문자열 내에 없다면
-1
을 리턴한다.print("장발장은 거꾸로 해도 장발장".find("장발장")) # 0 print("장발장은 거꾸로 해도 장발장".rfind("장발장")) # 12
2. 리스트 -> index()
- index() : 왼쪽부터 찾아서 처음 등장하는 위치를 찾는다.
- 찾는 요소가 리스트 내에 없다면
ValueError
가 발생한다.a = list("장발장은 거꾸로 해도 장발장") print(a.index("장")) # 0
def solution(n):
answer = 0
# 에라토스테네스의 체를 위한 표
# index에 해당하는 수가 소수이면 True, 아니면 False
isPrime = [True] * (n+1)
for i in range(2, n//2+1):
# 소수의 배수들은 모두 소수가 아니다.
if isPrime[i]:
j = 2
while i * j <= (n):
isPrime[i*j] = False
j += 1
# 소수의 개수 세기
for i in range(2, n+1):
if isPrime[i]:
answer += 1
return answer
def solution(n):
# 2 ~ n의 수를 담은 집합 생성 -> 나중에는 소수의 집합이 된다.
num = set(range(2, n+1))
for i in range(2, n+1):
# i가 소수라면
if i in num:
# n이하의 i의 배수를 num에서 삭제한다.
num -= set(range(i*2, n+1, i))
return len(num)
range로 n이하의 i의 배수 리스트 만들기
i, n = 5, 100 a = list(range(i, n+1, i)) print(a) # [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]
def solution(n):
return "수박"*(n//2) if n % 2 == 0 else "수박"*(n//2) + "수"
def solution(n):
return "수박"*(n//2) + "수"*(n%2)
한줄 코드에 욕심이 나서 한줄 코드도 많이 작성해본 하루였다.
이제는 한줄코드보다는 좀 더 친절한 코드로 작성해야지..