본문 바로가기

백준 PS일지/Etc

[Swift/백준] 2309: 일곱 난쟁이 + map의 특징 | PS일지

문제

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

간단한 문제 요약

난쟁이가 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)
        }
    }
}