[코테]/[Programmers Lv2]
[Programmers] Lv2_JadenCase 문자열 만들기 (JAVA)
Sky_
2021. 12. 21. 22:47
💻JAVA 코드 바로보기
□문제 설명
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
□제한사항
- s는 길이 1 이상인 문자열입니다.
- s는 알파벳과 공백문자(" ")로 이루어져 있습니다.
- 첫 문자가 영문이 아닐때에는 이어지는 영문은 소문자로 씁니다. ( 첫번째 입출력 예 참고 )
□입출력 예
s | return |
"3people unFollowed me" | "3people Unfollowed Me" |
"for the last week" | "For The Last Week" |
🌼 JAVA 알고리즘
□초기화면
□풀이과정
공백을 기준으로 각 단어가 나누어지는 것을 확인했다 |
class Solution {
public String solution(String s) {
String answer = "";
String[] spaced = s.split(" ");
for (int i = 0; i < spaced.length; i++) {
System.out.println(spaced[i]);
}
return answer;
}
}
나누어진 각 단어의 첫글자(대문자로 바꿀 글자)를 확인하고, 해당 문자가 영문자일 경우 아스키코드를 사용하여 대문자로 교환했다 |
class Solution {
public String solution(String s) {
String answer = "";
String[] spaced = s.split(" ");
for (int i = 0; i < spaced.length; i++) {
System.out.println(spaced[i].charAt(0));
}
return answer;
}
}
class Solution {
public String solution(String s) {
String answer = "";
String[] spaced = s.split(" ");
for (int i = 0; i < spaced.length; i++) {
char temp = spaced[i].charAt(0);
if(temp>96&&temp<123) temp -= 32;
System.out.println(temp);
}
return answer;
}
}
위와 같은 흐름으로 진행했을 때 테스트에서는 통과되었지만, |
class Solution {
public String solution(String s) {
String answer = "";
String[] spaced = s.split(" ");
for (int i = 0; i < spaced.length; i++) {
if(i!=0) answer += " ";
//단어별 첫문자 대문자로 변경
char upper = spaced[i].charAt(0);
if(upper>='a'&&upper<='z') upper -= 32;
answer+=upper;
//첫문자 제외한 모든 문자 소문자로 변경
for(int j=1;j<spaced[i].length();j++){
char lower = spaced[i].charAt(j);
if(lower>='A'&&lower<='Z') lower += 32;
answer+=lower;
}
System.out.println(answer);
}
return answer;
}
}
풀이방법이 깔끔하지 않아 걱정했는데, 역시나 코드의 효율성이 많이 떨어져서인지 런타임에러가 발생했다 |
코드를 조금 더 단순화시키기 위해 split() 사용과 동시에 모든 문자를 소문자로 변경하도록 수정했다 |
class Solution {
public String solution(String s) {
String answer = "";
//모든 문자 소문자로 변경
String[] spaced = s.toLowerCase().split(" ");
for (int i = 0; i < spaced.length; i++) {
if(i!=0) answer += " ";
System.out.println(spaced[i]);
//첫문자를 대문자로 변경
answer+= Character.toUpperCase(spaced[i].charAt(0));
answer+= spaced[i].substring(1);
}
return answer;
}
}
실행시간을 줄이기 위해 StringBuffer를 사용하는 방법도 있었지만, 나는 기존의 풀이방식을 이용하고 싶었다 |
[질문하기]란에서 런타임 이슈를 찾아보니, 띄어쓰기의 조건을 세부적인것까지 지정해주어야 한다는 해결책이 있었다 1. 공백이 연속적으로 존재할 경우 2. 마지막 문자가 공백일 경우 |
class Solution {
public String solution(String s) {
String answer = "";
//모든 문자 소문자로 변경 후 분리
String[] spaced = s.toLowerCase().split(" ");
for (int i = 0; i < spaced.length; i++) {
//기본 띄어쓰기 적용
if(i!=0) answer += " ";
//띄어쓰기별 각 단어 temp
String temp = spaced[i];
//연속된 공백일경우
if ("".equals(temp)) {
answer += temp;
}
//첫문자가 영대소문자일 경우 규칙적용
else if(spaced[i].charAt(0)>='A'&&spaced[i].charAt(0)<='z'){
answer += Character.toUpperCase(temp.charAt(0)) + temp.substring(1);
}
//첫문자가 영대소문자가 아닌 경우(숫자)
else {
answer += temp;
}
}
//마지막 문자가 공백일경우
if (" ".equals(s.substring(s.length()-1)))
answer += " ";
return answer;
}
}