본문 바로가기
알고리즘/기초

알고리즘 2일차

by useSword 2024. 3. 6.

알고리즘 문제를 풀다가 아래의 개념들에 좀 더 알아보고 싶었다.

 

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

'알고리즘 > 기초' 카테고리의 다른 글

알고리즘 3일차  (0) 2024.03.07
알고리즘 1일차  (3) 2024.03.05