간단한 문제 요약
난쟁이가 9명 있었다. 근데 찐 난쟁이는 7명이다. 그리고 이들의 특징은 7명의 키를 더한 값은 100이라는 것이다. 이상한 난쟁이를 빼고 진짜 7명의 난쟁이의 키를 순차적으로 출력하시오!
고려해야 할 사항
- 난쟁이를 찾을 수 없는 경우 x
- 아홉 난쟁이는 모두 키가 다릅니다.
- 정답이 여러 개가 될 수 있습니다.
문제 풀이, 느낀점
문제 풀이
9C2
9명 중 2 명을 선택해서 전체 키에서 선택된 두명의 키를 뺐을 때 답이 정답입니다.
두명을 선택하기 위해 이중 포문을 사용했습니다. 첫 포문의 경우 마지막 전까지, 두번째의 경우 이전 포문에서 선택한 다음 부터 난쟁이를 선택하도록 했습니다.
문제를 푸는 방법은 두가지가 있는데 이때 조심할 점은 두명의 난쟁이를 찾았다고 해서 remove(at:)를 통해 난쟁이 배열에서 바로 삭제해버리면 안됩니다. 전체적인 크기가 줄기 때문에 다음 난쟁이의 index가 정확하지 않습니다. 이럴땐 remove(at: 배열.firstIndex(of:특정 키)! 를 사용해서 삭제해야 합니다. firstIndex(of:)는 주어진 배열에서 특정 element가 위치한 첫번째 index를 반환합니다.
느낀점
map을 중점으로 썼는데 정말 신기하게 여러 경험을 했습니다. 우선 map 안에서 return을 사용해면 현재 값이 저장되고 map의 다음 Element를 호출하게 되는데 이 점을 인지하지 못해서 함수 안에 map을 사용해서 틀린 경험이 있습니다.. 함수 전체가 종료되야하는데 map의 특정 로직만 종료 되기 때문에 포문이 계속해서 돌아갔다는.. ( 함수 덕에 특정 조건을 찾으면 바로 종료하려고 시킨건데 map만 다음 sequence로 넘어가지다니,, map을 잘 써야 겠다는 생각이...)
두번째로는 import Foundation의 중요성인데,, 이걸 안하면 틀리고 하면 맞았다고 됩니다.
1. import Foundation을 추가하지 않았을 경우
exit(0) 함수를 사용할 수 없게 됩니다. 신기합니다. ( 또 틀렸다는,, )
코드
import Foundation
var list = (0..<9).map{_ in Int(readLine()!)! }
let sum = list.reduce(0,+)
(0..<8).map{ i in
(i+1..<9).map{ j in
if sum - list[i] - list[j] == 100 {
print(list
.filter{$0 != list[i] && $0 != list[j]}
.sorted()
.map{String($0)}
.joined(separator:"\n"))
exit(0)
}
}
}
'백준 PS일지 > Etc' 카테고리의 다른 글
[백준/Swift] 10814: 나이순 정렬 | PS일지 | 고차함수 사용!! (0) | 2023.04.21 |
---|---|
[백준/Swift] 1927 : 최소힙 (0) | 2023.01.08 |