본문 바로가기

알고리즘/Baekjoon

[2941] 크로아티아 알파벳

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

  1. 크로아티아 알파벳을 특정한 패턴으로 변경 할 수 있음.
  2. 단어가 주어졌을 때 크로아티아 알파벳 개수를 세야함
  3. 테이블에 주어지지 않은 알파벳은 한 글자씩 세야함
  4. 입력은 최대 100개 의 단어로 구성되며, 알파벳 소문자와 '-', '=' 으로만 이루어 짐.
  5. 입력이 몇개의 크로아티아 알파벳으로 이루어져 있는지 출력해야 함

 

[2. 해결 계획]

  1. 변환 된 패턴을 정의하는 배열을 구성
  2. 입력된 문자열에 앞에서 부터 (1) 에서 정의 된 패턴과 매치되는 것이 있는지 확인
  3. 있으면, 해당 길이만큼 slice 를 부분 슬라이스하고, 없는 경우 1 만큼만 부분 슬라이스함
    위 과정에서 알파벳 개수를 세야함.

 

[3. 계획 검증]

 

[4. 구현]

package main

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

func main() {
	r := bufio.NewReader(os.Stdin)
    // Fscanf 사용 고려?
    // ReadString 은 delim 까지 읽어들임.
	input, _ := r.ReadString('\n')
    // 윈도우 계열에서는 개행을 \r\n 으로 읽어들임.
	input = strings.Trim(input, "\r\n")
	byteStr := []byte(input)

    // 정의 된 패턴
	specials := []string{"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="}

	count := 0
	for len(byteStr) > 0 {
		matchedLen := 1
        // byte slice 를 string 으로
		partialStr := string(byteStr)

		for _, special := range specials {
            // 특수 패턴으로 시작하는 경우
			if strings.HasPrefix(partialStr, special) {
				matchedLen = len(special)
				break
			}
		}
		count++
        // 부분 슬라이스 진행
		byteStr = byteStr[matchedLen:]
	}

	fmt.Println(count)
}

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

[1021]. 회전하는 큐  (0) 2022.08.22
[1316] 그룹 단어 체커  (0) 2022.02.05
[1157] 단어 공부  (0) 2022.02.05
[1065] 한수  (0) 2022.02.05
[4673] 셀프 넘버  (0) 2022.02.05