본문 바로가기

알고리즘/Baekjoon

[1316] 그룹 단어 체커

[1. 문제 재정의 및 추상화]

  1. 문제에서 정의하는 그룹 단어
    => 단어에 존재하는 모든 문자에 대해서 각 문자가 연속해서 나타나는 경우
    => kin: k, i, n 이 한번씩 연속해서 나타나므로 그룹 단어
    => aabbbccb: b 가 불연속이므로 그룹 단어가 아님
  2. 입력으로는 단어의 개수 N 이 맨 처음줄에 있고, 그 밑으로 N 만큼 단어가 주어짐
  3. 1 <= N <= 100
  4. 단어는 소문자로만 구성되고, 중복되지 않으며, 그 길이는 최대 100

 

[2. 해결 계획]

  1. 알파벳이 위치가 인접하지 않는 경우가 하나라도 있는 경우 그룹단어가 아니다.

 

[3. 계획 검증]

 

[4. 구현]

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func isGroupWord(input string) int {
	var table [255]int
	byteStr := []byte(input)

	for ch := 'a'; ch <= 'z'; ch++ {
        // 소문자에 대해서 초기화 진행
        // 알파벳이 string 내 위치하는 offset 을 의미함.
		table[ch] = -1
	}

	for index, value := range byteStr {
		ref := &table[int(value)]

		if *ref == -1 {
            // 최초 인 경우 offset 만 저장
			*ref = index
		} else if index-*ref != 1 {
            // offset 간 차이가 1 이 아닌 경우 => 불연속 => 그룹 단어가 아님
			return 0
		} else {
            // offset 간 차이가 1이며 이 경우 offset 을 갱신
			*ref = index
		}
	}

	return 1
}

func main() {
	r := bufio.NewReader(os.Stdin)
	TC := 0

	fmt.Fscanf(r, "%d\n", &TC)
	count := 0

	for TC > 0 {
		input, _ := r.ReadString('\n')
		input = strings.TrimRight(input, "\r\n")

		TC--
		count += isGroupWord(input)
	}

	fmt.Println(count)
}

'알고리즘 > Baekjoon' 카테고리의 다른 글

[2630]. 색종이 만들기  (0) 2022.08.24
[1021]. 회전하는 큐  (0) 2022.08.22
[2941] 크로아티아 알파벳  (0) 2022.02.05
[1157] 단어 공부  (0) 2022.02.05
[1065] 한수  (0) 2022.02.05