사전 스터디 마지막 주차인 4주 차가 시작되었다.
우리 팀은 이번 주차에 개인 공부 + 알고리즘을 진행하기로 하였다.
호기롭게 하루에 알고리즘 10개씩 하기로 했다.
연습문제라고 쓰여 있는 "쉬운" 거만 10개 골라서 금방 할 줄 알았는데 예상외로 시간이 꽤 걸렸다.😅
프로그래머스에 있는 코딩테스트 연습에 올라온 문제들을 풀었다.
def solution(a, b):
answer = ''
days = ['FRI','SAT','SUN','MON','TUE','WED','THU']
months = [31,29,31,30,31,30,31,31,30,31,30,31]
answer = days[(sum(months[:a-1])+b)%7-1]
return answer
처음에 이 문제를 보자마자 든 생각은 '이게 연습문제라고?' , '연습을 이렇게 한다고???' 였다..ㅋㅋㅋ
처음에는 '어떻게 해야겠다'는 생각도 없이 '이게 뭐야..😮' 하면서 그냥 문제만 뚫어져라 보고 있었다.
어떤 날짜가 나와도 답이 나와야 했기 때문에, days[숫자]
형식으로 접근해야겠다고 생각했다.
1월 1일이 금요일이므로 days
는 FRI
로 시작하게 했다. 그리고 7일마다 다시 리스트의 처음 부분으로 돌아와야 했기 때문에 나머지를 구해주는 %
를 사용했고 1월 1일로부터 지난 날을 모두 더하기 위해서 sum
에 b
를 더하고 1일부터 시작했기 때문에 1을 빼주었다.
import datetime
def getDayName(a,b):
t = 'MON TUE WED THU FRI SAT SUN'.split()
return t[datetime.datetime(2016, a, b).weekday()]
sum(리스트 범위)
함수로 리스트값을 모두 더할 수 있다는 점을 새롭게 알게 되었다.datetime
을 활용하면 저렇게 간단하게도 할 수 있는데 import
할 생각은 해보지도 못했다.def solution(s):
answer = ''
div = int(len(s)/2)
if len(s)%2 == 0:
answer = s[div-1:div+1]
else:
answer = s[div:div+1]
return answer
문제에서 요구한데로 짝수/홀수를 구분해야겠다고 먼저 생각했고 짝수인 경우와 홀수인 경우를 다르게 해주기 위해 조건문으로 나누었다.
def string_middle(str):
# 함수를 완성하세요
return str[(len(str)-1)//2:len(str)//2+1]
변수도 없고 조건문도 없이 이렇게 깰끔하게도 가능하다니,,? 😲
//
를 쓰면 나누고 올림/내림을 안 해줘도 된다.def solution(arr):
answer = []
answer.append(arr[0])
for i in range(1, len(arr)):
if arr[i] != arr[i-1]:
answer.append(arr[i])
return answer
먼저 arr
의 첫 번째 요소를 숫자를 answer
에 추가하고 추가된 요소와 그다음 요소가 다를 경우에만 answer
에 append
해주어 연속으로 같은 숫자가 나오지 않을 경우에만 append
시켰다.
def no_continuous(s):
a = []
for i in s:
if a[-1:] == [i]: continue
a.append(i)
return a
마지막으로 append
된 부분을 [-1:]
로 처리한 부분이 인상적이었다.
def solution(arr, divisor):
answer = []
for i in range(len(arr)):
if arr[i]%divisor == 0:
answer.append(arr[i])
answer.sort()
if len(answer) == 0:
answer.append(-1)
return answer
나누어서 나머지가 0인 요소만 answer
에 append
해주었고, 아무 값도 리스트에 없다면 -1
을 append
하였다.
def solution(arr, divisor): return sorted([n for n in arr if n%divisor == 0]) or [-1]
sorted()
함수를 공부해보면 좋을것 같다.
def solution(a, b):
answer = 0
gap = a - b
if a > b:
for i in range(abs(gap)+1):
answer = answer + a - i
elif a < b:
for i in range(abs(gap)+1):
answer = answer + a + i
elif a == b:
answer = a
return answer
def adder(a, b):
if a > b: a, b = b, a
return sum(range(a,b+1))
a
가 b
보다 클 때만 스왑을 해줬다
a, b = b, a
swap 하기sum()
두 변수 사이 값 모두 더하기..!def solution(strings, n):
answer = []
s = []
for string in strings:
s.append(string[n:n+1]+string)
print(s)
s.sort()
print(s)
for i in s:
answer.append(i[1:])
print(answer)
return answer
n
번째 문자를 기준으로 정렬을 해야 해서 n
번째 문자를 각 요소 앞에 붙여주고 sort
했다.
그 이후 맨 앞에 붙은 n
번째 문자를 제외한 문자를 answer.append
했다.
def strange_sort(strings, n):
'''strings의 문자열들을 n번째 글자를 기준으로 정렬해서 return하세요'''
return sorted(strings, key=lambda x: x[n])
sorted()
, lamda
를 사용해서 간단하게 코드를 짜보자
def solution(s):
num_lower_p = s.count('p')
num_upper_p = s.count('P')
num_p = num_lower_p + num_upper_p
num_lower_y = s.count('y')
num_upper_y = s.count('Y')
num_y = num_lower_y + num_upper_y
if num_p == num_y:
return True
else:
return False
def numPY(s):
# 함수를 완성하세요
return s.lower().count('p') == s.lower().count('y')
count
했어도 이 코드에서는 문제가 없을 거 라는 걸 깨달았다.return
에서 비교를 하여 바로 True
, False
가 반환되도록 하는것도 간결하고 좋아보인다.def solution(s):
answer = ''
lst = []
for i in range(len(s)):
lst.append(s[i:i+1])
lst.sort()
lst.reverse()
for i in lst:
answer = answer+i
return answer
def solution(s):
return ''.join(sorted(s, reverse=True))
sorted
함수를 모르고 있었던 때라서 문자열을 리스트로 바꿔서 sort
했는데 sorted
함수는 시퀀스 자료형 뿐만 아니라 순서에 구애받지 않는 자료형도 적용 가능하고 list
로 반환한다.for
문으로 직접 문자열을 만들 필요 없이 join
으로 간단하게 해결할 수 있었다. 😔def solution(s):
if len(s) == 4 or len(s) == 6:
try:
int(s)
answer = True
except ValueError:
answer = False
else:
answer = False
return answer
int
타입으로 변환이 되면 True
, 아니면 False
를 리턴하게 했다.
def alpha_string46(s):
return s.isdigit() and len(s) in (4, 6)
def solution(seoul):
location = seoul.index('Kim')
answer = '김서방은 '+str(location)+'에 있다'
return answer
def findKim(seoul):
return "김서방은 {}에 있다".format(seoul.index('Kim'))