[백준] 2470번 - 두 용액

yerimstar·2021년 11월 25일
0

정렬

목록 보기
7/8

1차시도 - 틀렸습니다

# 두 용액
 import sys
 N = sys.stdin.readline().strip() # 전체 용액의 수

 solution = list(map(int,sys.stdin.readline().split())) # 용액

 acid_solution = [x for x in solution if x > 0]
 alkali_solution = [x for x in solution if x < 0]

 if len(alkali_solution) == 0: # 산성 용액만 있는 경우 -> 양수
     acid_solution = sorted(acid_solution) # 산성 용액 오름차순 정렬
     print(acid_solution[0],acid_solution[1])
 elif len(acid_solution) == 0: # 알칼리성 용액만 있는 경우 -> 음수
     alkali_solution = sorted(alkali_solution) # 알칼리 용액 오름차순 정렬
     print(alkali_solution[-2],alkali_solution[-1])
 else: # 두 용액 모두 있는 경우
     solution = sorted(solution)
     print(solution[0],solution[-1]

반례발견
입력 -1 2 1
정답 -1 1
출력값 -1 2

2차시도 - 메모리 초과

# 두 용액
import sys

N = sys.stdin.readline().strip() # 전체 용액의 수

solution = list(map(int,sys.stdin.readline().split())) # 용액

acid_solution = [x for x in solution if x > 0]
alkali_solution = [x for x in solution if x < 0]

if len(alkali_solution) == 0: # 산성 용액만 있는 경우 -> 양수
    acid_solution = sorted(acid_solution) # 산성 용액 오름차순 정렬
    print(acid_solution[0],acid_solution[1])
elif len(acid_solution) == 0: # 알칼리성 용액만 있는 경우 -> 음수
    alkali_solution = sorted(alkali_solution) # 알칼리 용액 오름차순 정렬
    print(alkali_solution[-2],alkali_solution[-1])
else: # 두 용액 모두 있는 경우
    mixed_solution = list(set([(min(x,y),max(x,y),abs(x+y)) for x in solution for y in solution if x != y]))
    mixed_solution.sort(key=lambda x : x[2])
    print(mixed_solution[0][0],mixed_solution[0][1])

0과 가까운 값 계산 - 절댓값 활용 abs함수

최종 코드

# 두 용액
import sys

N = int(sys.stdin.readline().strip()) # 전체 용액의 수

solution = sorted(map(int,sys.stdin.readline().split())) # 용액

start = 0
end = N-1
final = list()
while start < end:
    mixture = [solution[start],solution[end],abs(solution[start] + solution[end])] # 혼합값
    final.append(mixture)
    sum = solution[start] + solution[end]
    if sum > 0: # 합이 양수이므로 큰 값을 줄여줘야 한다
        end = end -1
    elif sum < 0: # 합이 음수이므로 작은 값을 키워줘야 한다
        start = start + 1
    elif sum == 0: # 0인 경우 break
        break

final.sort(key=lambda x : x[2]) # 절댓값 기준으로 정렬한다.
print(final[0][0],final[0][1])

투포인터.....라고 합니다.
참고 링크 - https://studyandwrite.tistory.com/388

profile
백엔드 개발자

0개의 댓글