알고리즘 문제를 풀다가 아래의 개념들에 좀 더 알아보고 싶었다.
join
- ''.join(리스트)
''.join(리스트)를 이용하면 매개변수로 들어온 ['a', 'b', 'c'] 이런 식의 리스트를 'abc'의 문자열로 합쳐서 반환해주는 함수인 것입니다.
- '구분자'.join(리스트)
'구분자'.join(리스트)를 이용하면 리스트의 값과 값 사이에 '구분자'에 들어온 구분자를 넣어서 하나의 문자열로 합쳐줍니다.
'_'.join(['a', 'b', 'c']) 라 하면 "a_b_c" 와 같은 형태로 문자열을 만들어서 반환해 줍니다.
reverse, reversed
reverse는 list타입에서만 제공하는 함수
reverse의 예시
l = ['a', 'b', 'c']
리스트에서만 사용이 가능하다.
다른 부분에 사용하면 아래처럼 에러가 나타난다.
# AttributeError: 'tuple' object has no attribute 'reverse'
# AttributeError: 'dict' object has no attribute 'reverse'
# AttributeError: 'str' object has no attribute 'reverse'
l = ['a', 'b', 'c']
l_reverse = l.reverse()
print(l_reverse) # None
print(l) # ['c', 'b', 'a']
#이걸 통해 reverse는 return처럼 값을 반환한다는 걸 알 수 있다.
reversed의 예시
아래처럼 사용해야 제대로 된 값을 나타낼 수 있다.
l = ['a', 'b', 'c']
t = ('a', 'b', 'c')
list(reversed(l)) # ['c', 'b', 'a']
tuple(reversed(t)) # ('c', 'b', 'a')
''.join(reversed(l)) # 'cba'
위처럼 하지 않을 경우는 아래와 같다.
l = ['a', 'b', 'c']
t = ('a', 'b', 'c')
d = {'a': 1, 'b': 2, 'c': 3}
s = 'abc'
reversed(l) # <listreverseiterator object at 0x101053c10>
reversed(t) # <reversed object at 0x101053b50>
reversed(d) # TypeError: argument to reversed() must be a sequence
reversed(s) # <reversed object at 0x101053c10>
l = ['a', 'b', 'c']
t = ('a', 'b', 'c')
s = 'abc'
reversed(l) # <listreverseiterator object at 0x101053c10>
reversed(t) # <reversed object at 0x101053b50>
reversed(s) # <reversed object at 0x101053c10>
참고한 블로그
https://itholic.github.io/python-reverse-reversed/
<풀이과정>
1. 배열 뒤집기 문제를 풀고 다른 사람의 코드를 보다가 섹시한 코드를 보았다.
//내 코드
def solution(num_list):
return list(reversed(num_list))
//섹시한 코드
def solution(num_list):
return num_list[::-1]
list[::-1]를 안배운 사람이 있을까... 잊지 않기 위해 TIL에 작성하도록 할 생각이었다.
2. 문제중에 str 1 안에 str2가 있다면 1을 return하고 없으면 2를 return하라고 했었다.
if in이 되나 싶었는데 되서 만족하며 문제를 풀었다.
if str2 in str1:
return 1
else:
return 2
그리고 이 문제에서 섹시하게 해답을 내놓은 분이 있었다. 그 분의 코드는 아래와 같다.
없으면 +1을 하여 2가 되도록 return을 하는 것이었다.
def solution(str1, str2):
return 1 + int(str2 not in str1)
알고리즘 2일차
brute-force(완전탐색) 알고리즘
가능한 경우의 수를 일일이 나열하면서 답을 찾는 방법
완전탐색의 가치
→ 현실세계의 문제중에는 손으로 직접 풀기에는 경우의 수가 너무 많은 경우가 종종있다. 이를 컴퓨터의 도움으로 해결하는 방법이 좋은 대안이다
재귀 함수의 개념
컴퓨터가 수행하는 많은 작업들은 대개 작은 조각들로 나누어 볼 수 있다.
들여다 보는 범위가 작아지면 작아질수록, 각 조각의 형태가 유사해진다.
>>>내가 생각하기에는 재귀에서는 반복을 위해 자신의 함수를 다시 반환하여 반복하는 것 같은데 아직 재귀함수를 많이 보질 않아서 데이터가 부족하다.
반복문
n=10
sum_val=0
for i in range(n+1):
sum_val+=i
print(sum_val) #55출력
재귀함수
num=10
def recursive(n):
if n==1:
return n #기저 사례
return n+recursive(n-1)
print(recursive(num)) #55출력
그리디 알고리즘
그리디 알고리즘은 지금 당장 좋은 방법만을 선택한다
그리디 알고리즘은 많은 경우 최적해를 찾지 못한다..
→ 그리디 알고리즘을 사용해서 항상 최적해를 구할 수 있는 문제에서만 사용
→ 해당 문제에서 탐욕적 알고리즘의 정당성을 증명하는 과정을 연습해야 함.
<해야할 일 >
그리디 문제를 아직 해결하지 못했다. 이 부분을 해결해야함.
<질문>
Q1. 아래의 코드에 대해 질문하기. 잘 이해가 안됨.
for i in range(start, len(elements)):
combinations = combinations_recursive(elements, k - 1, i + 1, current + [elements[i]])
result.extend(combinations)
return result