[BOJ] 5052번 : 전화번호 목록(Go, Golang)

김영한·2021년 3월 17일
0

알고리즘

목록 보기
27/74

문제 링크 : 백준 5052번

[문제 접근]

문자열을 조작하는 문제이다.
항상 C++로 풀다가 Go로 문자열 문제를 풀면서 느끼는 건 Go가 문자열 문제를 풀긴 더 쉬운 것 같다.

  1. arr 슬라이스에 문자열들을 오름차순으로 정렬
  2. strings의 메소드인 HasPrefix를 이용해 접두어인지 아닌지 판단한다.
    • strings.HasPrefix(a, b)라고 하면 b가 a의 접두어인지 아닌지 bool형으로 반환해준다.
  3. true가 나오면 접두어이므로 check를 false로 변경 후 run 레이블을 나간다.

⭐️ 왜 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")
		}
	}
}

0개의 댓글