문제 링크 : 백준 5052번
문자열을 조작하는 문제이다.
항상 C++로 풀다가 Go로 문자열 문제를 풀면서 느끼는 건 Go가 문자열 문제를 풀긴 더 쉬운 것 같다.
⭐️ 왜 arr[i]와 arr[i-1]만 비교하면 되는지는 문자열을 오름차순으로 정렬하고 출력해보면 알 수 있다.(숫자 크기로 정렬되는 것이 아니라 문자기준으로 작은 것 순으로 정렬된다.)
ex) 1, 2, 3, 4, 10 인 문자열을 정렬하면 1, 10, 2, 3, 4가 된다.
따라서 자기보다 1 인덱스 작은 문자열과 비교하여 접두어가 포함되어 있지 않으면 그 앞은 절대 접두어가 포함되어 있을 수 없다.
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
var (
r = bufio.NewReader(os.Stdin)
w = bufio.NewWriter(os.Stdout)
t, n int
)
func main() {
defer w.Flush()
fmt.Fscan(r, &t)
for t > 0 {
t--
fmt.Fscan(r, &n)
arr := make([]string, n)
for i := 0; i < n; i++ {
fmt.Fscan(r, &arr[i])
}
// 문자열 오름차순으로 정렬
sort.Strings(arr)
check := true
run:
// 접두어인지 판별
for i := n - 1; i > 0; i-- {
if strings.HasPrefix(arr[i], arr[i-1]) {
check = false
break run
}
}
if check {
fmt.Fprintln(w, "YES")
} else {
fmt.Fprintln(w, "NO")
}
}
}