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 |