[문제 - 이상한 문자 만들기]
[코딩테스트 연습 > 연습문제 > 이상한 문자 만들기]
https://school.programmers.co.kr/learn/courses/30/lessons/12930?itm_content=course14743
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[접근 방식]
상당히 까다로운 문제였다.
겉으로 볼때는 굉장히 단순한 문제이지만, 여러 변수를 모두 고려해야 한다.
1. 시작과 끝에 공백이 있는 경우
2. 단어와 단어 사이에 공백이 2개 이상으로 나눠져 있는 경우
EX) "first second" 와 같이 단어 사이에 3개의 공백이 있을때,
"FiRsT SeCoNd" 가 결과로 나와야 하는데, 이때 공백 3개가 유지되어야 한다.
따라서 기존의 접근 방식과 다른 것으로 접근해야 해결가능한 문제였다.
기존 접근 방식은 string.split(" ") 을 통해, 단어 단위로 나눠서 해결하려 하였으나, 공백의 개수를 유지해야하고, 문자열 시작과 끝에 공백이 있을 수도 있기 때문에 이 방식을 이용할 수는 없다.
새로운 접근 방식은 문자(char) 단위로 하나하나 끊어서 해결해야 한다.
공백이 몇개가 연속되든 answer 에 추가 해야 한다.
[Java 코드]
//https://school.programmers.co.kr/learn/courses/30/lessons/12930?itm_content=course14743
//코딩테스트 연습 - 연습문제 - 이상한 문자 만들기
class Solution {
public String solution(String s) {
String answer = "";
int cnt = -1;
String[] array = s.split("");
for(String ss : array) {
cnt = ss.contains(" ") ? -1 : cnt + 1;
answer += cnt%2 == 0 ? ss.toUpperCase() : ss.toLowerCase();
}
return answer;
}
}
String[] array = s.split("");
문자 단위로 문자열을 분해한다.
for(String ss : array) {
cnt = ss.contains(" ") ? -1 : cnt + 1;
answer += cnt%2 == 0 ? ss.toUpperCase() : ss.toLowerCase();
}
문자가 공백(" ")일 경우 - 단어 별로 인덱스를 기록하는 cnt 를 -1으로 초기화한다.
문자가 공백(" ")이 아닐 경우 - 단어의 인덱스를 누적한다.
단어의 인덱스가 짝수인 경우 - 대문자 변환 , 정답에 누적
단어의 인덱스가 홀수인 경우 - 소문자 변환 , 정답에 누적
" hello world "
-> " ", " ", "h", "e", "l", "l", "o", " ", " ", " ", "w", "o", "r", "l", "d", " "
[Rewind]
1. 어려웠던 점
- "문자 단위로 분해" 라는 개념을 생각하지 못했다.
- 설령 문자 단위로 분해 라는 아이디어에 도달하였다 해도, 어떤 식으로 공백이 아닌 단어의 인덱스 짝수 / 홀수 를 구분하는지에 대한 방식을 생각하지 못했을 것이다.
2. 알게된 점
- 문자열 문제에 대한 한가지 해결 아이디어를 알게 되었다. (문자 단위로 분해)
3. 개선 방안
- 여러 문제를 많이 접해서 익숙해 져야 한다.
- 자바에 대한 공부가 더욱 필요하다.