BOJ 4344 : 평균은 넘겠지

Ok Haeeun·2022년 12월 13일
0

Go로 algorithm문풀

목록 보기
5/16

ㅋㅋㅋㅋㅋㅋ아 문제 누가 만드신겨...
진실을 알려주고 싶은 마음을 문제 제작으로 승화시키셨네

오늘 생각의 흐름..
"머야 개쉬운데 이걸 적어서 풀어?"라고 생각할 수 있겠으나
나는 적어서 품ㅇㅇ 대충 내가 잊지 않고 이해하는 방식이다.
쓰지 않으면 기억을 잘 못하는 편..

Go로도 위와 같이 풀 생각인데,
이번 문제로

고랭에서의 배열, >> slice << , 소수점 포메팅

을 배울 수 있을 것 같다..! 레고

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)으로

O(n^2)이다....

Go 치곤 별로인듯




그치만 이번 문제에선 Golang에 관해 많은 것을 배울 수 있었다.

1. Go에서는 배열(array)보다 슬라이스(slice)

배열은 크기가 고정되어있지만, 슬라이스는 크기가 고정되어 있지 않아

slice1 := []int{1,2,3,4,5}
slice1 = append(slice1, 6) // slice1에 6을 append

와 같이 append를 통해 요소를 추가할 수 있다.


복사를 하는 경우,

배열 ) 같은 값을 가진 새로운 배열을 생성
슬라이스 ) 같은 주소값을 가지는 완전히 동일한 배열을 생성

차이를 가진다.

2. printf에서 %도 출력하고싶을 때 %%로 escape가능

이거는 다른 언어에서도 마찬가지일 것 같은데, 내가 몰랐던 사실이었다..!
자꾸 [MISSING] % 라고 떠서 어찌나 당황했던지..

어쨌든 해결

3. type 강제변환은 흔하게 int(a), float64(b)방식으로 사용

평균값을 계산할 때, 소숫점을 살려야되다보니 타입을 int에서 float으로 바꿔야했다. Golang도 강제 형변환은 일반적인 언어와 같았다.

4. 소숫점 반올림, 올림, 내림은 math 패키지 이용

  • math.Round() : 반올림
  • math.Ceil() : 올림
  • math.Floor() : 내림

잊지말기~

5. slice 선언은 var slice []int = make([]int, n)

var slice []int = make([]int, n)    // int형 요소를 n개 넣을 slice를 만들겠다는 의미

+ 어째 맨날 까먹는 것 같지만, 소숫점 포메팅은 %2.4f 같은 형식으로 해준다..

소숫점 앞에 몇자리 보여줄지, .뒤에 몇자리까지 보여줄지를 말하는 것..
맨날 이걸 까먹는다. 되새김질 완료

profile
貫徹

0개의 댓글