코딩테스트 공부하면서 기억해두고자 하는 내용이 있어서 별도로 포스팅을 했다.
for index, value := range SLICE에서 에서 value 는 call by value인가 call by reference인가
==> 결론은 call by value 이다.
slice 정렬하기
package baek
import (
"bufio"
"fmt"
"os"
"sort"
)
func main() {
r := bufio.NewScanner(os.Stdin)
r.Split(bufio.ScanWords)
n := scanInt1931(r)
answer := 0
meatings := make([][2]int, n)
// 1. 값이 meatings에 들어가는 경우
// 1-1 좌측에 meatings 배열의 위치 입력
for i := 0; i < n; i++ {
meatings[i][0], meatings[i][1] = scanInt1931(r), scanInt1931(r)
}
// 1-2 포인터 사용
// for index, _ := range meatings {
// meating := &meatings[index]
// meating[0], meating[1] = scanInt1931(r), scanInt1931(r)
// }
// 2. 값이 meatings에 들어가지 않는 경우
// for index, value := range meatings {
// 2-1 포인터를 사용하지 않은 경우
// meating := meatings[index]
// meating[0], meating[1] = scanInt1931(r), scanInt1931(r)
// 2-2 value값에 값을 넣는 경우
// value[0],value[1] = scanInt1931(r), scanInt1931(r)
// }
sort.Slice(meatings, func(i, j int) bool {
if meatings[i][1] == meatings[j][1] {
return meatings[i][0] < meatings[j][0]
}
return meatings[i][1] < meatings[j][1]
})
fmt.Println(meatings)
now := 0
for _, meating := range meatings {
if meating[0] > now {
now = meating[1]
answer += 1
}
}
fmt.Println(answer)
}
func scanInt1931(r *bufio.Scanner) int {
result := 0
r.Scan()
for _, val := range r.Bytes() {
result *= 10
result += int(val - '0')
}
return result
}
결론
1. 참조값을 불러올때 포인터를 사용할지 말지 잘 구분을 해줘야 겠다.
2. 정렬할 때 sort.Slice()를 사용해서 여러가지 조건을 통해 정렬을 할 수 있다.