자료구조 및 알고리즘/백준

[python] 11728. 배열 합치기

viamemine 2023. 1. 16. 15:34
728x90
반응형
  • 문제 



  • 잘못된 풀이
len_A, len_B = map(int, input().split())

A = list(map(int, input().split())) # list로 저장
B = list(map(int, input().split())) # list로 저장

new_list = []
while len(A) >= 0 and len(B) >= 0:
    if len(A) == 0 and len(B) != 0: # A가 비어 있을 때
        a = 100
        b = min(B)
    elif len(A) != 0 and len(B) == 0: # B가 비어 있을 때
        a = min(A)
        b = 100
    elif len(A)==0 and len(B) ==0:
        break
    else: # 둘 다 안 비어있을 때
        a = min(A)
        b = min(B)

    new_list.append(min(a,b)) # 둘 중에 작은 원소를 새로운 리스트에 추가

    if min(a,b) in A:
        A.remove(min(a,b))
    else:
        B.remove(min(a,b))

print(*new_list)

 

내가 기존에 생각한 방법은 A 리스트에서 가장 작은 원소와 B 리스트 중에 가장 작은 원소를 비교하여

더 작은 원소를 new_list에 append하는 방법이다.

new_list에 추가했으면 해당 원소는 기존의 원소에서 삭제되고, 두 리스트 모두 비어있을 때까지 반복한다.

 

여전히 .. 더러운 코드 .. 출제자의 의도와는 많이 벗어나보이는 코드 풀이 + '시간초과' 발생 !

그리고 빈 리스트에 대해 임시적으로 100의 값을 주는 것이 잘못된 풀이이다.

 

 

  • 올바른 풀이

새로운 풀이 방법으로 투 포인터 방법을 사용했다.


# two pointer으로 해결
len_A, len_B = map(int, input().split())

A = list(map(int, input().split()))
B = list(map(int, input().split()))

answer = []
a_p, b_p = 0, 0 # a pointer, b pointer

while a_p != len_A or b_p != len_B:
    if a_p == len_A: # A를 다 봤을 때
        answer.append(B[b_p])
        b_p += 1
    elif b_p == len_B: # B를 다 봤을 때
        answer.append(A[a_p])
        a_p += 1
    else:
        if A[a_p] < B[b_p]: # 더 작은 수를 append
            answer.append(A[a_p])
            a_p += 1
        else:
            answer.append(B[b_p])
            b_p += 1
print(*answer)

 

다음과 같이 A 리스트를 위한 pointer(a_p), B 리스트를 위한 pointer(b_p)를 사용해서 정렬했다.

두 포인터가 각 리스트의 길이가 될 때까지 (모든 원소를 볼 때까지) while문이 돈다.

A 리스트 원소와 B 리스트 원소 중에 더 작은 수를 answer list에 append 하는 방법이다.

 

투 포인터 방법보다 더 간단하고 쉬운 방법은, 파이썬에서 제공하는 라이브러리인 sorted()를 사용하는 방법이다.

# sorted()로 해결
len_A, len_B = map(int, input().split())

A = list(map(int, input().split())) # list로 저장
B = list(map(int, input().split())) # list로 저장

new_list = sorted(A+B)
print(*new_list, sep=' ')

 

728x90

'자료구조 및 알고리즘 > 백준' 카테고리의 다른 글

[python] 1181. 단어 정렬  (0) 2023.01.18
[python] 2108. 통계학  (0) 2023.01.16
[python] 9020. 골드바흐의 추측  (0) 2023.01.14
[python] 4948. 베르트랑 공준  (0) 2023.01.13
[python] 1929. 소수 구하기  (0) 2023.01.12