Fall in IT.

입력받은 문자열에 중복되는 문자가 있는지 확인 방법 본문

Algorithm

입력받은 문자열에 중복되는 문자가 있는지 확인 방법

D.Y 2022. 8. 30. 21:13

안녕하세요.

 

오늘은 입력받은 문자열에 중복된 문자가 존재하는지 확인하는 알고리즘을 작성해보겠습니다.

(아래 알고리즘은 Golang 언어를 사용하므로 언어에 따라 다를 수 있습니다)

 

사전지식

  • 문자열 집한인 문자열을 순회할 수 있는가?
  • 한글과 영문 모두 문자열 순회할 수 있는가? (index 순회를 할 경우 구분 필요, range로 순회할 경우 rune타입으로 변환하여 순회하기 때문에 상관없다)
  • rune 타입에 대하여 알고 있는가? (rune은 유니코드를 표현하는 타입으로 int32 타입의 별칭과 같다)
  • 유니코드 인코딩에서 한글은 3byte를 사용하고 영어는 1byte를 사용한다.
  • 유니코드와 아스키코드의 개념

 

문제

  • 문자열이 주어졌을때 이 문자열에 같은 문자가 중복되어 존재하는지 확인하라
  • 자료구조를 사용하지 않고 확인하는 방법도 작성하라

 

풀이

func main() {
	fmt.Println(isDuplicateCharactor("114"))
	fmt.Println(isDuplicateCharactor("145"))
	fmt.Println(isDuplicateCharactor("19151"))
	fmt.Println(isDuplicateCharactor("가나다라마가"))

	fmt.Println("=============================================")

	fmt.Println(isDuplicateCharactor2("114"))
	fmt.Println(isDuplicateCharactor2("145"))
	fmt.Println(isDuplicateCharactor2("19151"))
	fmt.Println(isDuplicateCharactor2("가나다라마가"))
}

func isDuplicateCharactor(input string) bool {
	var (
		charMap = make(map[string]bool)
		result  = false
	)

	if input == "" {
		return result
	}

	for _, v := range input {
		char := string(v)
		fmt.Println(char, v)

		if _, exist := charMap[char]; exist {
			result = true
			break
		}

		charMap[char] = true
	}

	fmt.Println(charMap)
	return result
}

func isDuplicateCharactor2(input string) bool {
	var result = false

	if input == "" {
		return result
	}

	// len()은 바이트 길이를 반환하기 때문에 한국어와 같은 3byte 문자를 사용하면 깨지게 된다.
	// 이땐 rune타입을 사용하여 문자 하나를 4바이트로 변환시킨 후 출력할 수 있다.

	// for i := 0; i < len(input); i++ {
	// 	fmt.Println(string(input[i]))
	// }

	inputRune := []rune(input)
	for i := 0; i < len(inputRune); i++ {
		char := string(inputRune[i])

		for j := i + 1; j < len(inputRune); j++ {
			char2 := string(inputRune[j])

			if char == char2 {
				return true
			}
		}
	}

	return result
}

 

 

 

 

Comments