※ 문제링크
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 더 나은 개발자가 되기위해 공부중입니다. 잘못된 부분을 댓글로 남겨주시면 학습하는데 큰 도움이 될 거 같습니다.
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ] 1520번 내리막 길 / 사용언어 : 파이썬(python) (0) | 2022.03.13 |
---|---|
[BOJ] 13424번 비밀 모임 / 사용언어 : 파이썬(python) (0) | 2022.03.12 |
[BOJ] 1946번 신입 사원 / 사용언어 : 파이썬(python) (0) | 2022.03.12 |
[BOJ] 9663번 N-Queen / 사용언어 : 파이썬(python) (0) | 2022.03.12 |
[BOJ] 15654번 N과 M(5) / 사용언어 : 파이썬(python) (0) | 2022.03.09 |
댓글