-
출처 : 프로그래머스 코딩테스트 연습, https://school.programmers.co.kr/learn/courses/30/lessons/12951#
- JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열
- 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 (첫 번째 입출력 예 참고)
- 문자열 s를 JadenCase로 바꾼 문자열을 리턴하기처음에 공백을 기준으로 split 해서 배열에 담고 첫글자만 대문자, 나머지만 소문자로 바꾸면 끝날 것 같았는데
공백이 연속해서 나올 수 있다는 부분을 고려해주지 않아서 " " -> " " 이렇게 나와야 하는데 " " -> "" 이렇게 나왔다.
나의 풀이
문자 단위가 아니라 한글자씩 쪼개서
- 완전 첫 글자이면 대문자로,
- 이후에 앞에 공백있으면 대문자, 아니면 소문자로 바꾼다.
(아스키 코드 10진수에서 65 ~ 90 : 대문자, 97 ~ 122 : 소문자 이다.)
class Solution { public String solution(String s) { StringBuilder sb = new StringBuilder(); char[] cs = s.toCharArray(); // 첫글자 처리 int ci = (int)cs[0]; String ss = String.valueOf(cs[0]); if((ci >= 65 && ci <= 90) || (ci >= 97 && ci <= 122)) { //문자이면 대문자로 ss = ss.toUpperCase(); } sb.append(ss); for(int i=1; i<cs.length; i++) { ss = String.valueOf(cs[i]); ci = (int)cs[i]; if(cs[i-1] == ' ') { // 문자이면 대문자로 if((ci >= 65 && ci <= 90) || (ci >= 97 && ci <= 122)) { ss = ss.toUpperCase(); } } else { // 문자이면 소문자로 if((ci >= 65 && ci <= 90) || (ci >= 97 && ci <= 122)) { ss = ss.toLowerCase(); } } sb.append(ss); } return sb.toString(); } }
다른사람의 풀이를 보고
공백도 숫자도 대소문자로 바꾸는 toUpperCase, toLowerCase를 통과할 수 있다는 것을 알게 되었다.
공백인인지 아닌지만 확인하면 되도록 바꿀 수 있었다.
class Solution { public String solution(String s) { StringBuilder sb = new StringBuilder(); char[] cs = s.toCharArray(); // 첫글자 처리 String ss = String.valueOf(cs[0]).toUpperCase(); sb.append(ss); for(int i=1; i<cs.length; i++) { if(cs[i-1] == ' ') { ss = String.valueOf(cs[i]).toUpperCase(); } else { ss = String.valueOf(cs[i]).toLowerCase(); } sb.append(ss); } return sb.toString(); } }
처음에 전부 소문자로 바꾼 후에 첫글자이거나 공백이후 문자이면 대문자로 바꾸는 방법도 있고,
Character가 아니라 String 단위로 쪼개면 형변환 부분을 없애서 가독성을 높일 수 있었다.
class Solution { public String solution(String s) { StringBuilder sb = new StringBuilder(); s = s.toLowerCase(); String[] cs = s.split(""); sb.append(cs[0].toUpperCase()); for(int i=1; i<cs.length; i++) { if(" ".equals(cs[i-1])) { sb.append(cs[i].toUpperCase()); } else { sb.append(cs[i]); } } return sb.toString(); } }
그런데 형변환을 없앴다고 속도가 더 빨라지는 것은 아니었다.
큰 차이는 아니었지만 char단위로 할때가 조금 더 빨랐다.
문자열의 길이가 0보다 크다면 공백이 아닌 것으로 판단하고, 첫글자를 잘라서 대문자로, 나머지는 소문자로 변경한 풀이도 보았다...
이렇게 하나 더 배워간다.
'자바알고리즘' 카테고리의 다른 글
[백준] 2745 진법변환(java) (0) 2025.01.11 [프로그래머스 LV.1] 바탕화면 정리 (java) (0) 2023.04.07 [프로그래머스 LV. 1] 공원 산책 (java) (0) 2023.04.03 [262가지 문제로 정복하는 코딩 인터뷰 간단요약] 8장 스택과 큐 (0) 2022.12.24 [262가지 문제로 정복하는 코딩 인터뷰 간단요약] 7장 연결리스트 (0) 2022.12.13 댓글