상세 컨텐츠

본문 제목

Golang Algorithm - JadenCase 문자열 만들기(프로그래머스)

Programming Language/Go

by Yongari 2023. 7. 11. 15:54

본문

 

 

 

JadenCase 문자열 만들기

문제 설명
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건
s는 길이 1 이상 200 이하인 문자열입니다.
s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
숫자는 단어의 첫 문자로만 나옵니다.
숫자로만 이루어진 단어는 없습니다.
공백문자가 연속해서 나올 수 있습니다.

입출력 예

s return
"3people unFollowed me" "3people Unfollowed Me"
"for the last week" "For The Last Week"

 

 

 

첫 번째 풀이. 

처음에는 upper를 bool 변수 같이 설정하고 진행했다. 0이면 false, 1이면 true 이런식으로 가정하고 진행했다. 그러나  테스트 케이스에서 계속 변수가 나왔고 하드코딩식으로 코딩이 계속되서 이 생각을 전부 버리고 다른 풀이로 해야겠다고 생각했다.

 

func solution0(s string) string {
	// upper가 true일 때 대문자, false일 때는 소문자화
	// 문자 첫번째가 숫자일 경우, 나머지 문자는 공백이 나올 때까지 소문자로 변환
	upcheck := 0
	answer := ""

	for i, v := range s {
		if i == 0 && v != 32 {
			//&& v >= 65 && v <= 90
			answer = strings.ToUpper(string(v))
			upcheck = 0
		}
		// fmt.Println("v, answer, upper", v, answer, upcheck)
		// 앞이 숫자일 때
		if v >= 48 && v <= 57 {
			answer += string(v)
			upcheck = 0
		} else if upcheck == 0 && v != 32 && i != 0 {
			answer += strings.ToLower(string(v))
		} else if upcheck == 1 && v != 32 {
			answer += strings.ToUpper(string(v))
			upcheck = 0
		} else if v == 32 {
			answer += string(v)
			upcheck = 1
		}
	}
	fmt.Println("answer", answer)
	return answer
}

 

두 번째 풀이. 

이번에는 슬라이스에 담은 뒤에 단어의 앞문자만 대문자로 하고 나머지는 전부 소문자로 하는 것을 생각했다. 이후 코드를 그렇게 만들었고 좀 더 간단하게 처리했다. 테스트케이스까지 전부 통과했다. 특히 앞에문자가 공백일 때 현재 문자는 전부 대문자화 시킨것이 주요했다. 그리고 맨처음 문자는 앞에 공백이 없다보니 하드코딩같이 설정했다. 

func solution1(s string) string {
	arr := []string{}
	for _, v := range s {
		arr = append(arr, string(v))
	}

	for i, v := range arr {
		if i == 0 {
			arr[0] = strings.ToUpper(string(v))
		} else if arr[i-1] == " " {
			arr[i] = strings.ToUpper(string(v))
		} else {
			arr[i] = strings.ToLower(string(v))
		}
	}

	answer := strings.Join(arr, "")
	return answer
}

 

세 번째 다른 사람풀이... 

문화충격이다. 그냥 라이브러리에서 문자열 안에 첫 문자는 전부 대문자로 바꿔주는 라이브러리가 있었다..

func solution2(s string) string {
	return strings.Title(strings.ToLower(s))
}

 

공식문서와 자료구조, 알고리즘만 공부해도 코딩테스트에 쓰는 삽질 시간을 대폭 줄일 수 있다.. 

그러나 위의 strings.Title은 디프리케이트 됐다. 따라서 다음의 "Cases"를 활용하는 것을 추천한다. 



 

예제코드와 문서  

package main

import (
	"fmt"

	"golang.org/x/text/cases"
	"golang.org/x/text/language"
)

func main() {
	str := "peter parker. james bond"
	caser := cases.Title(language.English)
	fmt.Println("str = ", str)
	str_title := caser.String(str)
	fmt.Println("str_title_cased = ", str_title)
}

 

 

참고 :

Cases : https://pkg.go.dev/golang.org/x/text/cases#Title  (공식 문서)

 

cases package - golang.org/x/text/cases - Go Packages

Package cases provides general and language-specific case mappers. package main import ( "fmt" "golang.org/x/text/cases" "golang.org/x/text/language" ) func main() { src := []string{ "hello world!", "i with dot", "'n ijsberg", "here comes O'Brian", } for _

pkg.go.dev

 

Cases2 : https://www.geeksforgeeks.org/using-title-method-to-capitalise-string-in-golang/ 

 

Using Title Method to Capitalise String in Golang - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org


Title : https://pkg.go.dev/strings#Title

 

strings package - strings - Go Packages

Title returns a copy of the string s with all Unicode letters that begin words mapped to their Unicode title case. Deprecated: The rule Title uses for word boundaries does not handle Unicode punctuation properly. Use golang.org/x/text/cases instead. packag

pkg.go.dev

 

관련글 더보기