https://www.acmicpc.net/problem/3649
3649번: 로봇 프로젝트
각 테스트 케이스마다 한 줄에 하나씩, 구멍을 완벽하게 막을 수 있는 두 조각이 없다면 'danger'를 출력한다. 막을 수 있는 경우에는 'yes ℓ1 ℓ2'를 출력한다. (ℓ1 ≤ ℓ2) 정답이 여러 개인 경우에
www.acmicpc.net
투 포인터 문제다. 예전에 런타임 에러를 마주하고 해결하지 못해 포기했다가 최근에 다시 봐서 해결한 문제.
풀이
입력된 레고를 길이 순으로 정렬한 뒤 처음과 끝에서 탐색하면서 범위를 좁히면 된다. 탐색 도중 조건이 맞으면 바로 결과를 출력. 대신 테스트 케이스의 제한이 안 적혀있어 결과물을 모아서 한 번에 출력했다. 스위프트의 print() 메서드가 다른 언어에 비해 속도가 느리기 때문에 출력 양이 많은 경우에는 이런 식으로 해결하는 경우가 많다.
정답 코드
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
import Foundation | |
var ans = "" | |
//while let line = Int(readLine())!{ | |
while let line = readLine(){ | |
let x = Int(line)! * 10000000 | |
let n = Int(readLine()!)! | |
var arr = [Int]() | |
for _ in 0..<n{ | |
arr.append(Int(readLine()!)!) | |
} | |
arr.sort(by: <) | |
var start = 0 | |
var end = arr.count-1 | |
var str = "danger\n" | |
while start<end{ | |
let sum = arr[start]+arr[end] | |
if sum == x{ | |
str = "yes \(arr[start]) \(arr[end])\n" | |
break | |
} | |
if sum < x{ | |
start += 1 | |
} | |
if sum > x{ | |
end -= 1 | |
} | |
} | |
ans += str | |
} | |
print(ans) |

주석처리 부분이 런타임에러 코드의 수정 전 부분이다. 무한 입력을 받기 위해 while let 문을 사용했는데, 마지막 입력없이 끝나는 부분에서 공백 문자열에 대해 정수형 변환이 일어나 런타임 에러가 일어나지 않았나 생각해본다. xcode에서는 아무 문제없이 빌드되길래 다른 케이스에서 인덱스 오류인 줄 알고 여러 번 삽질했다..
'Problem Solving > BOJ' 카테고리의 다른 글
[12851] 숨바꼭질 2 (0) | 2022.11.30 |
---|---|
[2096] 내려가기 (0) | 2022.11.29 |
[1916] 최소비용 구하기 (0) | 2022.11.25 |
[1105] 팔 (1) | 2022.11.24 |
[12015] 가장 긴 증가하는 부분 수열2 (0) | 2022.11.23 |