Skip to main content

[Java] 12930 이상한 문자 만들기


1. 문제

이상한 문자 만들기


2. 오답정리

첫번째 시도

class Solution {
    public String solution(String s) {
        // 먼저 얘를 공백 기준으로 분리해서 배열에 넣고
        String[] str = s.split(" ");
        for (int i = 0; i < str.length; i++) {
            for (int j = 0; j < str[i].length(); j++) {
                if (j % 2 == 0) {
                    str[i].charAt(j) = str[i].charAt(j).UpperCase();
                } else {
                    str[i].charAt(j) = str[i].charAt(j).LowerCase();
                }
            }
        }
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length; i++) {
            sb.append(str[i]);
            sb.append(" ");
        }

    return sb.toString();
    }
}

class Solution {
    public String solution(String s) {
        // 먼저 얘를 공백 기준으로 분리해서 배열에 넣고
        String[] str = s.split(" ");
        for (int i = 0; i < str.length; i++) {
            for (int j = 0; j < str[i].length(); j++) {
                if (j % 2 == 0) {
                    str[i].charAt(j) = str[i].charAt(j).UpperCase();
                } else {
                    str[i].charAt(j) = str[i].charAt(j).LowerCase();
                }
            }
        }
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length; i++) {
            sb.append(str[i]);
            sb.append(" ");
        }

    return sb.toString();
    }
}

틀린 이유

str[i].charAt(j)=
  • charAt(j)는 문자를 읽는 것만 가능하고, 거기에 값을 넣을 수 없음
  • 문자열은 immutable이라 직접 수정 X, StringBuilder 써야 함
str[i].charAt(j).UpperCase();
  • char에는 UpperCase() 같은 메서드가 없다.
  • 대신 Character.toUpperCase(char) / Character.toLowerCase(char)을 써야 한다.

두번째 시도

class Solution {
    public String solution(String s) {
        // 먼저 얘를 공백 기준으로 분리해서 배열에 넣고
        String[] str = s.split(" ");
        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; i < str.length; i++) {
            for (int j = 0; j < str[i].length(); j++) {
                if (j % 2 == 0) {
                    sb.append(Character.toUpperCase(str[i].charAt(j)));
                } else {
                    sb.append(Character.toLowerCase(str[i].charAt(j)));
                }
            }
            sb.append(" ");
        }
        
        // 마지막 공백 제거
        sb.deleteCharAt(sb.length() - 1);
        
        return sb.toString();
    }
}

image.png

image.png

틀린 이유

내가 해결한 로직

  1. split(" ")로 s를 공백 기준으로 분리해서 String배열로 담음
  2. 이렇게 하면 구분자인 공백은 제외하고 글자만 담김
  3. 그래서 바깥 for문 실행 마다, 한 단어가 끝나면 뒤에 sb.append(" ")로 공백 추가
    1. 단, 이렇게 하면 마지막 문자 뒤에도 공백이 붙음
    2. sb.deleteCharAt() 으로 마지막 공백 제거

예상 원인

테스트 케이스 중에 연속 공백이 들어가는게 있느 것 같음..... 문제에는 그런 말 없는데 연속 공백 처리가 안되서 그런것같다
split(" ", -1) 쓰니까 한번에 해결됨


3. 정답코드

class Solution {
    public String solution(String s) {
        String[] str = s.split(" ", -1); // 이렇게 하면 연속 공백도 보존됨
        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; i < str.length; i++) {
            for (int j = 0; j < str[i].length(); j++) {
                if (j % 2 == 0) {
                    sb.append(Character.toUpperCase(str[i].charAt(j)));
                } else {
                    sb.append(Character.toLowerCase(str[i].charAt(j)));
                }
            }
            sb.append(" ");
        }
        
        // 마지막 공백 제거
        sb.deleteCharAt(sb.length() - 1);
        
        return sb.toString();
    }
}

split() 안 쓰고 문자열을 통째로 순회하는 방법

class Solution {
    public String solution(String s) {
        StringBuilder sb = new StringBuilder();
        int idx = 0; // 단어 안에서의 인덱스

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c == ' ') {
                sb.append(" ");
                idx = 0; // 단어가 끊겼으니 인덱스 초기화
            } else {
                if (idx % 2 == 0) {
                    sb.append(Character.toUpperCase(c));
                } else {
                    sb.append(Character.toLowerCase(c));
                }
                idx++;
            }
        }
        return sb.toString();
    }
}