ㅋㅋㅋㅋㅋㅋ아 문제 누가 만드신겨...
진실을 알려주고 싶은 마음을 문제 제작으로 승화시키셨네
오늘 생각의 흐름..
"머야 개쉬운데 이걸 적어서 풀어?"라고 생각할 수 있겠으나
나는 적어서 품ㅇㅇ 대충 내가 잊지 않고 이해하는 방식이다.
쓰지 않으면 기억을 잘 못하는 편..
Go로도 위와 같이 풀 생각인데,
이번 문제로
을 배울 수 있을 것 같다..! 레고
package main
import (
"fmt"
"math"
)
func main(){
var c, k int
fmt.Scan(&c)
var ratioSlice []float64 = make([]float64, c)
for k<c{
var n, result, a int
fmt.Scan(&n)
var scoreSlice []int = make([]int, n)
for i:=0; i<n; i++{
fmt.Scan(&scoreSlice[i])
result += scoreSlice[i]
}
average := int(result)/n
for i:=0; i<n; i++{
if scoreSlice[i]>average {
a += 1
}
}
tempAverage := math.Round(float64(a)/float64(n)*100000)*0.001
ratioSlice[k] = tempAverage
k++
}
for i:=0; i<c; i++{
fmt.Printf("%.3f%%\n",ratioSlice[i])
}
}
...생각보다 진짜 오래걸렸다..
파이썬에 비해 메모리 효율은 훨씬 좋지만, 시간 효율은 되게 떨어진다..
근데 메모리가 어떻게 저렇게 줄어들 수가 있지..?
시간은 for문 때문에 많이 걸린 것 같다.
아직 go lang을 배우는 과정이라서 돌아가게만 짜기 바쁘다.
시간복잡도는 while문같은 for문 한개 안에 for문 두개가 들어있으므로 O((n+n)*n)에 출력을 위한 for문 한개 O(n) 이므로
O(2(n)^2+n)으로
Go 치곤 별로인듯
그치만 이번 문제에선 Golang에 관해 많은 것을 배울 수 있었다.
배열은 크기가 고정되어있지만, 슬라이스는 크기가 고정되어 있지 않아
slice1 := []int{1,2,3,4,5}
slice1 = append(slice1, 6) // slice1에 6을 append
와 같이 append를 통해 요소를 추가할 수 있다.
배열 ) 같은 값을 가진 새로운 배열을 생성
슬라이스 ) 같은 주소값을 가지는 완전히 동일한 배열을 생성
차이를 가진다.
이거는 다른 언어에서도 마찬가지일 것 같은데, 내가 몰랐던 사실이었다..!
자꾸 [MISSING] % 라고 떠서 어찌나 당황했던지..
어쨌든 해결
평균값을 계산할 때, 소숫점을 살려야되다보니 타입을 int에서 float으로 바꿔야했다. Golang도 강제 형변환은 일반적인 언어와 같았다.
잊지말기~
var slice []int = make([]int, n) // int형 요소를 n개 넣을 slice를 만들겠다는 의미
소숫점 앞에 몇자리 보여줄지, .뒤에 몇자리까지 보여줄지를 말하는 것..
맨날 이걸 까먹는다. 되새김질 완료