문제

훈련된 초밥 장인이 한 번 초밥을 쥘 때 담는 밥알은 320개라고 알려져 있다.
일식집에서 아르바이트를 하는 준식이는 N 개의 초밥을 열심히 만들어 보았지만 각 초밥에 담긴 밥알의 개수가 제각각이었다.
이 중에서 그나마 밥알의 개수가 320개에 가장 가까운 초밥 하나를 손님에게 내놓으려고 한다. 준식이는 몇 번째 초밥을 내놓아야 할까?

입력

첫째 줄에 초밥의 개수 N (1 ≤ N ≤ 100) 이 주어진다.

둘째 줄에 A[1], A[2], … , A[N] (1 ≤ A[i] ≤ 1 000) 이 주어진다. i 번째 초밥의 밥알의 개수는 A[i] 개다.

출력

밥알의 개수가 320개에 가장 가까운 초밥은 몇 번째 초밥인지 출력한다. 만약 이러한 초밥이 여러 개 있다면 가장 앞서는 것을 출력한다.

//입력 : 
4
480 310 350 220
//출력 : 
2

풀이

만든 스시들을 for문을 돌면서 각각 스시들의 밥알 개수과 320와의 절대값 차를 새로운 배열에 넣는다
그 절대값 차들로 구성되어 있는 배열의 최솟값이 있는 index를 출력한다

알게된 점

  1. Array.min()
    • 최솟값이 여러 개이면 가장 앞에 있는 값 반환
    • 1 이상부터 고려 ([1,2,3,4,0] -> 1이 최솟값)
    • Optional 값 반환
  2. Array.index(of:)
    • Array.Index는 Optional 형을 반환하므로 !을 통해 강제 언래핑을 해주었다
  3. 절대값 반환하기
    • abs : method형식, returnType : Int
    • magnitude : Property특성, returnType : UInt
let integer : Int = -34
let magnitudeInt = integer.magnitude
let absInt = abs(integer)

print(magnitudeInt, type(of: magnitudeInt)) 
//출력 : 34 UInt
  
print(absInt, type(of: absInt))
//출력 : 34 Int

코드

import Foundation

let N : Int = Int(readLine()!)!
let sushi : [Int] = readLine()!.split(separator : " ").map{Int(String($0))!}
var arr : [Int] = []
for s in sushi {
    arr.append(abs(320-s))
}
print(arr.index(of: arr.min()!)!+1)