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 (공식 문서)
Cases2 : https://www.geeksforgeeks.org/using-title-method-to-capitalise-string-in-golang/
Title : https://pkg.go.dev/strings#Title
Golang Algorithm - 저주의 숫자 3 (프로그래머스) (0) | 2023.07.22 |
---|---|
Golang Algorithm - 겹치는 선분의 길이 (프로그래머스) (0) | 2023.07.22 |
Golang Algorithm - H-Index(프로그래머스) (0) | 2023.07.10 |
Golang Algorithm - 순서쌍의 개수 (프로그래머스) (0) | 2023.07.09 |
Golang Algorithm - 문자열 밀기 (프로그래머스) (0) | 2023.06.23 |