상세 컨텐츠

본문 제목

Golang Algorithm - 정수를 나선형으로 배치하기

Programming Language/Go

by Yongari 2023. 5. 12. 19:49

본문

배열 만들기 2

문제 설명

정수 l과 r이 주어졌을 때, l 이상 r이하의 정수 중에서 숫자 "0"과 "5"로만 이루어진 모든 정수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

만약 그러한 정수가 없다면, -1이 담긴 배열을 return 합니다.

제한사항
1 ≤ l ≤ r ≤ 1,000,000
입출력 예
l   r   result
5   555 [5, 50, 55, 500, 505, 550, 555]
10  20  [-1]

입출력 예 설명
입출력 예 #1
5 이상 555 이하의 0과 5로만 이루어진 정수는 작은 수부터 5, 50, 55, 500, 505, 550, 555가 있습니다. 따라서 [5, 50, 55, 500, 505, 550, 555]를 return 합니다.


입출력 예 #2

10 이상 20 이하이면서 0과 5로만 이루어진 정수는 없습니다. 따라서 [-1]을 return 합니다.

 

 

 

다음과 같이 풀이 방법이 2가지가 있다.

 

정규표현식을 이용한 풀이

package main

import (
	"fmt"
	"regexp"
	"strconv"
)

/*
regexp.QuoteMeta(chars)는 chars 문자열에 포함된 메타문자를 이스케이프 처리하여 정규식 패턴을 만듭니다.
예를 들어 chars에 ^ 문자가 있으면 이 문자는 정규식에서 문자열의 시작 부분을 나타내는 메타문자이므로 이스케이프 처리가 필요합니다.

"^[" + pattern + "]+$"은 chars 문자열에 포함된 문자들로 이루어진 문자열을 매칭하는 정규식 패턴을 만듭니다.

	^는 문자열의 시작을 의미하며, ]는 chars 문자열의 마지막 문자를 의미하고, +는 해당 문자열이 한 번 이상 나타나는 것을 의미합니다. $는 문자열의 끝을 의미합니다.

	regexp.MustCompile(pattern)은 위에서 만든 정규식 패턴을 컴파일하여 사용할 수 있는 정규식 객체를 생성합니다.
	이렇게 생성된 정규식 객체를 이용해 re.MatchString(d) 메소드를 호출하여 d 문자열이 패턴에 매칭되는지 확인합니다.
	매칭되면 true를 반환하고, 매칭되지 않으면 false를 반환합니다.
*/
func isDigitisMadeOf(d string, chars string) bool {
	pattern := "^["
	pattern += regexp.QuoteMeta(chars)
	pattern += "]+$"
	re := regexp.MustCompile(pattern)
	return re.MatchString(d)
}

func solution1(l int, r int) []int {
	digits := "05"

	arr := []int{}
	for i := l; i <= r; i++ {
		//fmt.Println("l", i)
		if isDigitisMadeOf(strconv.Itoa(i), digits) {
			arr = append(arr, i)
		}

	}

	if len(arr) == 0 {

		arr = append(arr, -1)
	}
	fmt.Println("arr", arr)
	return arr
}


func main() {
	l := 5
	r := 555
	//r := 10
	solution1(l, r)
}

 

 

package main

import (
	"fmt"
	"strconv"
)

func check(num int) bool {
	str := strconv.Itoa(num)
	for _, r := range str {
		if r != '5' && r != '0' {
			return false
		}
	}
	return true
}

func solution(l int, r int) []int {
	result := []int{}
	for i := l / 5 * 5; i <= r; i += 5 {
		if i >= l && i <= r && check(i) {
			result = append(result, i)
		}
	}
	if len(result) == 0 {
		return []int{-1}
	}
	fmt.Println("result", result)
	return result
}

func main() {
	l := 5
	r := 555
	solution(l, r)
}

 

관련글 더보기