[Baekjoon] 2473. 三種類の溶液[G 4]
8242 ワード
📚 質問する
https://www.acmicpc.net/problem/2473
📖 に答える
nは5000個以下あります.5000の中から1つを選び、残りの2つはダブルポインタで購入します.
2つのポインタを活用するためにソートします.
1つ選択すると、sは0 eをn-1に設定します.
選択した値がsに等しい場合はs 1を増やし、eに等しい場合はe 1を減らします.
3つの数の和が0より大きいと、eは1減少する.
3つの数の和が0未満であると、s 1が増加する.
3つの数の和が0の場合は、直ちにその数を出力して終了します.
📒 コード#コード#
n = int(input())
arr = sorted(list(map(int, input().split())))
result = abs(arr[0] + arr[1] + arr[2]) # 비교하기 위한 값, 배열 앞에서 3개 선택하여 더한 후 절댓값을 넣는다.
result_arr = [arr[0], arr[1], arr[2]] # 배열에 세 수를 담아준다.
for i in range(n): # 하나를 우선 선택한다.
a = arr[i] # 하나 선택
s = 0 # 투포인터
e = n - 1
while s < e: # 같지 않을 때만 봐야 한다.
if s == i: # 선택한 값을 중복 선택하지 않기 위함
s += 1
continue
if e == i:
e -= 1
continue
if abs(a + arr[s] + arr[e]) < result: # 이전에 구한 값보다 작은 경우만
result = abs(a + arr[s] + arr[e]) # 세 수의 합의 절댓값을 초기화
result_arr = [a, arr[s], arr[e]] # 출력해야하니 배열에 담는다.
if a + arr[s] + arr[e] == 0:
print(*sorted([a, arr[s], arr[e]])) # 합이 0이면 바로 출력한다.
exit()
elif a + arr[s] + arr[e] > 0: # 합이 0보다 큰 경우 큰 값을 줄인다.
e -= 1
else: # 합이 0보다 작으면 작은 값을 키운다.
s += 1
print(*sorted(result_arr)) # 세 수를 정렬해 작은 수부터 출력한다.
🔍 結果
Reference
この問題について([Baekjoon] 2473. 三種類の溶液[G 4]), 我々は、より多くの情報をここで見つけました https://velog.io/@yunhlim/Baekjoon-2473.-세-용액-G4テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol