이상한 문자 만들기

자라나는 ㅇㅅㅇ개발자·2023년 11월 15일
0

TIL

목록 보기
113/126

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.

우선은 내가 어리석게도 문제를 잘못읽어서 단어마다 짝홀을 하는것이 아닌 전체로 생각해 시간을 많이 소모했다.

public class Test_40_CreatingStrangeString {
    public String solution(String s) {
        StringBuilder stringBuilder = new StringBuilder();
        String[] strS = s.split(" ", -1);
        for (int i = 0; i < strS.length; i++) {
            for (int j = 0; j < strS[i].length(); j++) {
                if (j % 2 == 0) {
                    stringBuilder.append(Character.toUpperCase(strS[i].charAt(j)));
                } else {
                    stringBuilder.append(Character.toLowerCase(strS[i].charAt(j)));
                }
            }
            if (i < strS.length - 1) {
                stringBuilder.append(" ");
            }
        }

        return String.valueOf(stringBuilder);
    }
}

우선, 전체 문자열을 띄어쓰기 기준으로 배열을 만든다.
"try hello world" -> {"try", "hello", "world"}
for문을 돌려 각 인덱스마다 다시 for문으로 문자열의 위치를 구분지어 대문자와 소문자로 변환시키고
{"try", "hello", "world"} -> {"TrY", "HeLlO", "WoRlD"}
이것을 다시 인덱스 사이에 공백을 넣고 문자열로 되돌려 반환시킨다.
{"TrY", "HeLlO", "WoRlD"} -> "TrY HeLlO WoRlD"

그런데 아무리 코드를 뚫어지게 쳐다보고 확인해보아도 문제가 없는데
테스트케이스 4,5,8,9,11번에서 실패가 발생했다.

너무 억울해 구글에 검색을 해보니 나와같은 피해자가 많았는데
예를들어 매개변수 문자열 뒤에 공백이 2개 이상이 들어왔을 경우의 테스트 케이스가 있다는 것이었다.
이건 좀 너무 억까가 아닌가 싶었지만 문제의 제목을 보고 납득해버렸다.

뒤에 붙어있는 공백을 어떻게 해결할지 고민해보았는데
String.split 매서드에 limit매개변수가 있었다.
예를들어

String[] strS = s.split(" ", -1);

이렇게 작성하게되면 split 작업으로 생성되는 부분 문자열의 개수에 제한이 없다는 것을 의미하게되고, 뒤에 붙어있는 빈 문자열도 적용이 되었다.

String s = "try hello world " 라는 뒤에 공백이 3개가 들어간 문자열을 예로들어
String[] strS = s.split(" ");의 값은 {"try", "hello", "world"}가 되고
String[] strS = s.split(" ", -1);의 값은 {"try", "hello", "world", "", "", ""}가 되어 뒤의 빈 문자열도 포함된다.


다른사람의 코드를 보던 중 정말 창의적인 방법을 발견했는데

class Solution {
    public String solution(String s) {
        String answer;
        answer = s.toUpperCase();
        char[] chars = answer.toCharArray();

        //앞문자가 대문자라면 소문자로 치환
        for (int i = 1; i < chars.length; i++) {
            if (62 <= chars[i - 1] && chars[i - 1] <= 90) {
                chars[i] = Character.toLowerCase(chars[i]);
            }
        }
        answer = String.valueOf(chars);
        return answer;
    }
}

전부 대문자로 바꿔둔 뒤 문자배열로 변환시키고
반복문을 통해 앞에 나온 문자가 대문자일 경우 소문자로 변환을 수행하는 로직이라 공백은 아무것도 건들이지 않는 정말 창의적인 코드인거같다.

0개의 댓글