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

풀이
첫번째 줄에는 전체 용액의 수를 입력으로 받고, 두번째 줄은 각 용액의 특성값을 받아 liq라는 리스트를 생성한다. liq의 값들은 정렬된 순서로 주어졌기 때문에 두 용액의 합이 0에 가까운 정도를 구하기 위해서 투 포인터를 이용한다. 가장 작은 값과 가장 큰 값부터 시작해서 점차 안쪽의 용액 특성값의 합을 구하는 방식으로, 이를 위해 p1은 liq의 앞부분에서, p2는 liq의 뒷부분에서 시작하도록 한다. 출력값으로는 합해진 두 용액의 특성값을 가져가야 하기 때문에 small이라는 배열을 생성해 차례로 두 용액의 합, 앞 용액의 위치, 뒷 용액의 위치를 넣도록 한다. p1과 p2가 같은 위치를 가리키거나 용액의 합이 미리 0값을 가지지 않는 경우에 while문이 반복되도록 설정하고, 새로 구한 용액의 합이 기존의 값보다 0에 가까울 경우 small의 내용을 새롭게 갱신하도록 한다. 반대의 경우에는 새로 구한 용액의 합이 양수일 경우 p2의 값을 1만큼 감소시키고, 음수일 경우에는 p1의 값을 1만큼 증가시킨다. 이 과정을 모두 끝낸 뒤 small에 남아 있는 용액의 위치값을 가져와 합이 가장 0에 가까운 용액들의 특성값을 출력하도록 한다. 이를 코드로 구현하면 아래와 같다.
코드
n=int(input())
liq=[*map(int,input().split())]
p1=0
p2=n-1
small=[liq[p1]+liq[p2],p1,p2]
while ((p1!=p2) and (small[0]!=0)):
r=liq[p1]+liq[p2]
if abs(small[0])>abs(r):
small=[r,p1,p2]
else:
if r>=0:
p2-=1
else:
p1+=1
print(liq[small[1]],liq[small[2]])
결과

'Koala - 5기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[BOJ / Python] 1644 - 소수의 연속합 (0) | 2022.01.31 |
---|---|
[BOJ / C++] 2003 : 수들의 합2 (0) | 2022.01.31 |
BOJ 1644(python) : 소수의 연속합 (0) | 2022.01.31 |
[BOJ / C++] 14465 : 소가 길을 건너간 이유 5 (0) | 2022.01.30 |
[BOJ/c++] 9251 - LCS (0) | 2022.01.30 |
https://www.acmicpc.net/problem/2467
2467번: 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -
www.acmicpc.net
문제

풀이
첫번째 줄에는 전체 용액의 수를 입력으로 받고, 두번째 줄은 각 용액의 특성값을 받아 liq라는 리스트를 생성한다. liq의 값들은 정렬된 순서로 주어졌기 때문에 두 용액의 합이 0에 가까운 정도를 구하기 위해서 투 포인터를 이용한다. 가장 작은 값과 가장 큰 값부터 시작해서 점차 안쪽의 용액 특성값의 합을 구하는 방식으로, 이를 위해 p1은 liq의 앞부분에서, p2는 liq의 뒷부분에서 시작하도록 한다. 출력값으로는 합해진 두 용액의 특성값을 가져가야 하기 때문에 small이라는 배열을 생성해 차례로 두 용액의 합, 앞 용액의 위치, 뒷 용액의 위치를 넣도록 한다. p1과 p2가 같은 위치를 가리키거나 용액의 합이 미리 0값을 가지지 않는 경우에 while문이 반복되도록 설정하고, 새로 구한 용액의 합이 기존의 값보다 0에 가까울 경우 small의 내용을 새롭게 갱신하도록 한다. 반대의 경우에는 새로 구한 용액의 합이 양수일 경우 p2의 값을 1만큼 감소시키고, 음수일 경우에는 p1의 값을 1만큼 증가시킨다. 이 과정을 모두 끝낸 뒤 small에 남아 있는 용액의 위치값을 가져와 합이 가장 0에 가까운 용액들의 특성값을 출력하도록 한다. 이를 코드로 구현하면 아래와 같다.
코드
n=int(input())
liq=[*map(int,input().split())]
p1=0
p2=n-1
small=[liq[p1]+liq[p2],p1,p2]
while ((p1!=p2) and (small[0]!=0)):
r=liq[p1]+liq[p2]
if abs(small[0])>abs(r):
small=[r,p1,p2]
else:
if r>=0:
p2-=1
else:
p1+=1
print(liq[small[1]],liq[small[2]])
결과

'Koala - 5기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[BOJ / Python] 1644 - 소수의 연속합 (0) | 2022.01.31 |
---|---|
[BOJ / C++] 2003 : 수들의 합2 (0) | 2022.01.31 |
BOJ 1644(python) : 소수의 연속합 (0) | 2022.01.31 |
[BOJ / C++] 14465 : 소가 길을 건너간 이유 5 (0) | 2022.01.30 |
[BOJ/c++] 9251 - LCS (0) | 2022.01.30 |