Algorithms 💻

[알고리즘] - 선형배열 (정렬된 리스트에 원소 삽입하기)

당니이 2020. 12. 30. 15:02
반응형
✔ 주안점
- 원소가 기존 리스트의 원소보다 가장 크거나 가장 작은경우를 예외로 처리해야 했던 것

💻 부끄러운 내 코드

def solution(L, x):
    last = int(len(L)-1)
    for i in range(last):
        if int(L[i]) < int(x) < int(L[i+1]):   # 사이에 있는 경우
            L.insert(i+1, x)
            break
        
        # 삽입 원소가 가장 작은 경우, 가장 큰 경우 예외로 처리
        else:
            if x > int(max(L)) :
                L.insert(int(len(L)), x)
                break
            elif x < int(min(L)):
                L.insert(0, x)
                break
            else:
                pass
                
    return L     
✔ 문제점
- 단순 if와 else를 반복한 코드임. 너무 길고 불필요함. 
- index위치를 명확히 인지하지 못하고 그냥 i를 막 때려맞춘 것 같음

 

✔ 다른 풀이

1. for문을 이용하되 조금 더 간단하게 작성(append이용)

def solution(L, x):
    if x > L[-1]:
        L.append(x) # 가장 큰 원소 append처리
    else:
        for i in range(len(L)):
            if x <= L[i]:
                L.insert(i, x)
                break  # 어차피 처음보다 큰 원소 나오면 break 됨
    return L

- max와 min을 따로 if/elif로 판단할 필요가 없음. 그냥 max부분은 append로 처리하고, min은 저 for문 하나로 다 해결



2. for과 if문 한줄에 쓰기(반복문 한줄에 쓰기)

def solution(L, x):
    A = [i for i in range(len(L)) if x-L[i]>0] # x보다 작은 수를 가진 리스트 요소 모음
    L.insert(len(A), x)
    return L

- insert 위치를 주의해야함. len(A)는 x보다 작은 원소들의 개수임. insert위치는 맨처음 0부터 세므로 len도 가능


3. enumerate 이용
- enumerate : 반복문 사용 시 몇번째 반복문인지 확인(튜플형태로 반환)

# 예시)
t = [10, 40, 22, 11, 55]

for p in enumerate(t):
	print(p)
    
# output
# (0, 10), (1, 40), (2, 22), (3, 11), (4, 55)

enumerate를 이용해 삽입 위치를 쉽게 찾자!

def solution(L, x):
    for idx, num in enumerate(L):  
        if num > x:
            L.insert(idx, x) # 삽입 위치를 idx로 처리
            break
            
        if L[-1] < x:
            L.append(x) # max 예외는 역시 append 사용
        else:
            pass 
        
    return L

4. 다른 사기적인 방법(sort 이용)

def solution(L, x):
    L.append(x)
    L.sort()  # 그냥 append한 다음 한번에 sort...
    return L
def solution(L, x):
	return sorted(L + [x])
반응형