알고리즘/Baekjoon

정렬. [10825]

jdaemanv2 2023. 8. 19. 12:02

[1. 문제 설명]

https://www.acmicpc.net/problem/10825


[2. 풀이 접근]

전체 데이터를 구조체 형태고 감싸서 해당 배열을 정렬하는 방식으로 구현 할 수 있지만,

이렇게 할 경우, 불필요한 복사가 발생 하게 된다.

 

각 데이터를 순서대로 입력받아 각각의 배열에 저장하고,

각 배열 내 데이터를 가리키는 인덱스 배열을 생성한다.

 

이 인덱스 배열을 정렬하여 구현하도록 한다.


[3. 코드]

package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
var out *bufio.Writer
var in *bufio.Reader
var N int
var names [100_000]string
var langs [100_000]int
var engs [100_000]int
var maths [100_000]int
var indexs [100_000]int
func init() {
out = bufio.NewWriter(os.Stdout)
in = bufio.NewReader(os.Stdin)
// index 배열 초기화.
for i := range indexs {
indexs[i] = i
}
}
func solve() {
mysl := indexs[:N]
sort.Slice(mysl, func(l, r int) bool {
// l, r 은 mysl 의 index 를 가리킴
// 따라서, 실제 데이터 배열의 index 를 얻기 위해서는
// 해당 slice 에 저장된 값을 가져와야 한다.
left, right := mysl[l], mysl[r]
// 국어 점수를 내림차순으로 정렬
if langs[left] > langs[right] {
return true
} else if langs[left] == langs[right] {
// 국어 점수가 같은 경우, 영어 점수를 오름차순으로 정렬
if engs[left] < engs[right] {
return true
} else if engs[left] == engs[right] {
// 국어, 영어 점수가 같은 경우, 수착 점수를 내림차순으로 정렬
if maths[left] > maths[right] {
return true
} else if maths[left] == maths[right] {
// 국어, 영어, 수학 점수가 같은 경우 이름 순으로 정렬
if strings.Compare(names[left], names[right]) < 0 {
return true
}
}
}
}
// 그 외의 경우
return false
})
for _, idx := range mysl {
fmt.Fprintln(out, names[idx])
}
}
func main() {
defer out.Flush()
fmt.Fscan(in, &N)
for i := 0; i < N; i++ {
fmt.Fscan(in, &names[i], &langs[i], &engs[i], &maths[i])
}
solve()
}
view raw 10825.go hosted with ❤ by GitHub