https://www.acmicpc.net/problem/2118
2118번: 두 개의 탑
첫째 줄에 지점의 개수 N(2 ≤ N ≤ 50,000)이 주어진다. 다음 N개의 줄에는 차례로 두 지점 사이의 거리가 양의 정수로 주어진다. 전체 거리의 총 합은 1,000,000,000을 넘지 않는다.
www.acmicpc.net
투포인터 문제다.
풀이
문제에 주어지는 두 지점사이의 거리는 시계방향과 반시계 방향 중 짧은 쪽이 거리가 된다고 한다. 즉 시계방향 기준 반시계 방향 거리라 함은 (전체 길이 - 시계방향 거리) 로 계산이 가능하며 해당 지점의 거리는 둘 중 적은 거리로 정해진다는 것이다.
시작 인덱스와 끝 인덱스를 생성하여 구간의 길이를 측정한다. 구간의 길이가 최대거리보다 짧거나 같다면, 끝 인덱스를 한칸 늘린다. 반대로 현재 구간의 길이가 최대값보다 크다면, 시작 인덱스를 증가한다.
정답 코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
mport Foundation | |
let n = Int(readLine()!)! | |
var arr = [Int]() | |
var ans = 0 | |
var total = 0 | |
for _ in 0..<n{ | |
let num = Int(readLine()!)! | |
arr.append(num) | |
total += num | |
} | |
var head = 0 | |
var tail = 0 | |
var sum = 0 | |
while true{ | |
if sum > ans{ | |
sum -= arr[head] | |
head += 1 | |
}else if tail == n{ | |
break | |
}else{ | |
sum += arr[tail] | |
tail += 1 | |
} | |
ans = max(ans, min(sum,total-sum)) | |
} | |
print(ans) |

'Problem Solving > BOJ' 카테고리의 다른 글
[22862] 가장 긴 짝수 연속한 부분 수열 (large) (0) | 2023.01.19 |
---|---|
[1484] 다이어트 (0) | 2023.01.18 |
[1652] 누울 자리를 찾아라 (0) | 2023.01.16 |
[15565] 귀여운 라이언 (0) | 2023.01.15 |
[1337] 올바른 배열 (0) | 2023.01.14 |