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

[BOJ] 2467번 용액 / 사용언어 : 파이썬(python)

by 바른 호랑이 2022. 3. 12.
728x90
반응형

※ 문제링크

 

2467번: 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -

www.acmicpc.net

해당 문제는 투 포인터를 이용해서 해결할 수 있는 문제였다. 리스트의 양 끝단부터 조건에 따라 탐색하고, 탐색 종료 후 결과값을 출력하면 되는 문제였다. 조건 중에 입력값이 오름차순으로 정렬되어 들어온다는 조건이 있기에 정렬을 따로 수행하지 않아도 통과가 가능하였다. 주의해야할 점은 두 용액의 특성값이 음수일 수도 있다는 점인데, 반드시 비교를 하고 값을 저장할때는 절댓값을 사용해야했다. 자세한 문제풀이방법과 코드는 아래와 같다.

1. 입력받은 값들을 변수와 리스트에 저장해준다.

2. 리스트의 양 끝단의 인덱스를 포인터로 지정해주고, while문을 활용하여 왼쪽 포인터의 값이 오른쪽 포인터의 값보다 작으면 반복해서 탐색할 수 있게 반복문을 작성해준다.

3. 저장해놓은 특성값보다 작은 특성값이 들어오면 해당 용액들로 갱신해주고, 새 용액의 특성값이 기존 특성값보다 클 경우, 새 용액의 특성값이 음수인 경우, 왼쪽 포인터에 +1을 양수인 경우, 오른쪽 포인터에 -1을 한 후 계속 비교한다.

4. 반복문 종료 후 저장해놓은 용액들의 값들을 출력해준다. 

 

N = int(input())
liquids = list(map(int, input().split()))
cp1 = 0
cp2 = N-1
ans = [float('inf'), float('inf'), float('inf')] # [용액의 특성, 1번째 용액, 2번째 용액]
while cp1 < cp2:
    cp_value = liquids[cp1] + liquids[cp2]
    if abs(cp_value) < ans[0]:
        ans[0] = abs(cp_value)
        ans[1] = liquids[cp1]
        ans[2] = liquids[cp2]
    elif cp_value < 0:
        cp1 += 1
    else:
        cp2 -= 1
print(ans[1], ans[2])

 

P.S 더 나은 개발자가 되기위해 공부중입니다. 잘못된 부분을 댓글로 남겨주시면 학습하는데 큰 도움이 될 거 같습니다.

728x90
반응형

댓글