Go Lang/Algorithm

[GoLang] 백준 2607번 비슷한 단어

DSeung 2024. 1. 21. 22:43

개요

https://www.acmicpc.net/problem/2607

 

2607번: 비슷한 단어

첫째 줄에는 단어의 개수가 주어지고 둘째 줄부터는 한 줄에 하나씩 단어가 주어진다. 모든 단어는 영문 알파벳 대문자로 이루어져 있다. 단어의 개수는 100개 이하이며, 각 단어의 길이는 10 이

www.acmicpc.net

처음에는 1920번 수 찾기를 풀었던 경험을 살려 정렬 후 비교하는 로직의 방향으로 코드를 개발했습니다.

다음 규칙을 만족하면 비슷한 단어를 취급합니다

  • 구성은 GOD와 DOG를 두고 각각의 알파뱃의 개수가 완전히 같은 경우를 말한다.
  • 문자의 글자수가 같다면 안에 구성이 하나는 달라도 된다.
  • 글자수 차이가 1개가 난다면 안의 구성이 하나는 달라도 된다.

 

비슷한 단어를 찾을 값과 비슷한 단어의 값을 담은 slice를 정렬 후 차례대로 비교하다 보니

예외케이스가 너무 많아 이 로직은 아니다 싶어 찾은 게 아래 방식입니다.

 

간단한 게 최고

해당 문제는 시간복잡도를 크게 신경 쓰지 않아도 되는 문제입니다.

그래서 입력받을 때마다 문자열을 반복문으로 돌려서 차례대로 배열에 포함되는지 검사하고 

포함된다면 비교값에서 제거해서 중복체크가 되지 않게 했습니다.

 

맞을 확률이 20%여서 시간 복잡도를 생각하며 어렵게 다가갔는데

반복문 처리로 쉽게 해결해서 허무했던 문제입니다.

package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	var num int
	var origin string

	fmt.Fscanln(reader, &num)
	fmt.Fscanln(reader, &origin)

	var result int

	for i := 1; i < num; i++ {
		var compare string
		fmt.Fscanln(reader, &compare)

		var bigStr, smallStr string
		// 배열의 길이가 큰 값을 bigStr, 작은 값을 smallStr 에 할당
		if len(origin) > len(compare) {
			bigStr, smallStr = origin, compare
		} else {
			bigStr, smallStr = compare, origin
		}

		var check int
		// 반복문을 돌며 bigStr 의 문자를 smallStr 에서 찾아서 제거
		for j := 0; j < len(bigStr); j++ {
			if strings.Contains(smallStr, string(bigStr[j])) {
				smallStr = strings.Replace(smallStr, string(bigStr[j]), "", 1)
			} else {
				check++
			}
		}

		if check <= 1 {
			result++
		}
	}
	fmt.Println(result)
}
반응형