Algorithm

λŒ€ν‘œκ°’

CheonD 2022. 10. 1. 09:47

λŒ€ν‘œκ°’

 

 

 λ¬Έμ œ μ„€λͺ…

 

Nλͺ…μ˜ ν•™μƒμ˜ μˆ˜ν•™μ μˆ˜κ°€ μ£Όμ–΄μ§‘λ‹ˆλ‹€. Nλͺ…μ˜ ν•™μƒλ“€μ˜ 평균(μ†Œμˆ˜ 첫째자리 반올림)을 κ΅¬ν•˜κ³ , Nλͺ…μ˜ 학생 쀑 평균에 κ°€μž₯ κ°€κΉŒμš΄ 학생은 λͺ‡ 번째 학생인지 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έ μš”.
평균과 κ°€μž₯ κ°€κΉŒμš΄ μ μˆ˜κ°€ μ—¬λŸ¬ 개일 경우 λ¨Όμ € μ μˆ˜κ°€ 높은 ν•™μƒμ˜ 번호λ₯Ό λ‹΅μœΌλ‘œ ν•˜κ³ , 높은 점수λ₯Ό 가진 학생이 μ—¬λŸ¬ λͺ…일 경우 κ·Έ 쀑 ν•™μƒλ²ˆν˜Έκ°€ λΉ λ₯Έ ν•™μƒμ˜ 번호λ₯Ό λ‹΅μœΌλ‘œ ν•©λ‹ˆλ‹€.

β–£ μž…λ ₯μ„€λͺ…
첫쀄에 μžμ—°μˆ˜ N(5<=N<=100)이 주어지고, 두 번째 μ€„μ—λŠ” 각 ν•™μƒμ˜ μˆ˜ν•™μ μˆ˜μΈ N개의 μžμ—° μˆ˜κ°€ μ£Όμ–΄μ§‘λ‹ˆλ‹€. ν•™μƒμ˜ λ²ˆν˜ΈλŠ” μ•žμ—μ„œλΆ€ν„° 1둜 μ‹œμž‘ν•΄μ„œ NκΉŒμ§€μ΄λ‹€.

β–£ 좜λ ₯μ„€λͺ…
첫쀄에 평균과 평균에 κ°€μž₯ κ°€κΉŒμš΄ ν•™μƒμ˜ 번호λ₯Ό 좜λ ₯ν•œλ‹€. 평균은 μ†Œμˆ˜ 첫째 μžλ¦¬μ—μ„œ λ°˜μ˜¬λ¦Όν•©λ‹ˆλ‹€.

β–£

10 45

β–£

74

μž…λ ₯예제 1
73 66 87 92 67 75 79 75 80

좜λ ₯예제 1 7

μ˜ˆμ œμ„€λͺ…)
평균이 74점으둜 평균과 κ°€μž₯ κ°€κΉŒμš΄ μ μˆ˜λŠ” 73(2번), 75(7번), 75(9번)μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ μˆ˜κ°€ 높은 75(7번), 75(9번)이 닡이 될 수 있고, 75점이 두λͺ…μ΄λ―€λ‘œ ν•™μƒλ²ˆν˜Έκ°€ λΉ λ₯Έ 7번이 닡이 λ©λ‹ˆλ‹€.

 

 λ‚˜μ˜ 풀이

 

import Foundation

let n = Int(readLine()!)!
let input = readLine()!
let arr = input.components(separatedBy: " ")

let intArr = arr.map{Int($0)!}
let avg = Int(round(Double(intArr.reduce(0, +)) / Double(intArr.count)))
var minVal = 100
var minIdx = 0
var curVal = 0


for (i, num) in intArr.enumerated() {
  if abs(avg-num) <= minVal {
    if abs(avg-num) == minVal {
      if num > curVal {
        minVal = abs(avg-num)
        minIdx = i+1
        curVal = num
      } 
    } else {
        minVal = abs(avg-num)
        minIdx = i+1   
        curVal = num
    }
  }
}
print("\(avg) \(minIdx)")

 

 

 

 λ‹€λ₯Έ μ‚¬λžŒμ˜ 풀이

 

import Foundation

let n = Int(readLine()!)!
let input = readLine()!
let arr = input.components(separatedBy: " ")

let intArr = arr.map{Int($0)!}
let avg = Int(round(Double(intArr.reduce(0, +)) / Double(intArr.count)))
var minVal = 100
var minIdx = 0
var curVal = 0


for (i, num) in intArr.enumerated() {
  let tmp = abs(avg-num)
  if tmp < minVal {
    minIdx = i+1
    minVal = tmp
    curVal = num
  } else if (tmp == minVal) {
    if num > curVal {
      minIdx = i+1
      curVal = num
    }
  }
}
print("\(avg) \(minIdx)")

 

 

 ν”Όλ“œλ°±

1. λ‚΄ ν’€μ΄μ—μ„œλŠ” ifλ¬Έ μ•ˆμ—μ„œ 가은 경우의 수(==)을 두 번 μ‚¬μš©ν•΄μ„œ 쑰건을 효과적으둜 λ‚˜λˆ„μ§€ λͺ»ν–ˆλ‹€. (쑰건을 잘 λ‚˜λˆ„λŠ” 것이 μ€‘μš”)

2. μ€‘λ³΅λ˜λŠ” abs(avg-num)λ₯Ό λ³€μˆ˜λ‘œ λ‘μž