[코딩테스트] 백준 1931- go lang

개발개발·2022년 8월 16일
0

코딩테스트 공부하면서 기억해두고자 하는 내용이 있어서 별도로 포스팅을 했다.

  1. for index, value := range SLICE에서 에서 value 는 call by value인가 call by reference인가
    ==> 결론은 call by value 이다.

  2. 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. slice 를 정렬할 때는 sort.Slice(x interface{}, less func(i, j int) bool)를 사용한다. slice를 넣고 정렬할 기준을 함수로 넣어주면 된다. 위의 문제에서는 끝나는 시간을 기준으로 정렬하된 끝나는 시간이 같은 경우 시작 시간이 빠른 순으로 정렬하고 있다.

결론
1. 참조값을 불러올때 포인터를 사용할지 말지 잘 구분을 해줘야 겠다.
2. 정렬할 때 sort.Slice()를 사용해서 여러가지 조건을 통해 정렬을 할 수 있다.

profile
청포도루이보스민트티

0개의 댓글