알고리즘/Baekjoon
정렬. [10825]
jdaemanv2
2023. 8. 19. 12:02
[1. 문제 설명]
https://www.acmicpc.net/problem/10825
[2. 풀이 접근]
전체 데이터를 구조체 형태고 감싸서 해당 배열을 정렬하는 방식으로 구현 할 수 있지만,
이렇게 할 경우, 불필요한 복사가 발생 하게 된다.
각 데이터를 순서대로 입력받아 각각의 배열에 저장하고,
각 배열 내 데이터를 가리키는 인덱스 배열을 생성한다.
이 인덱스 배열을 정렬하여 구현하도록 한다.
[3. 코드]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | |
} |