본문 바로가기
Preparing Coding Test/Programmers L1

[Java] 이상한 문자 만들기

by weero 2020. 7. 23.

문제

https://programmers.co.kr/learn/courses/30/lessons/12930

 

코딩테스트 연습 - 이상한 문자 만들기

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

programmers.co.kr

 

 

참고

1. 문자열 나누기

1-1. java.lang.String.split() ( 출처 : elmkm.tistory.com/20 )      vs. StringTokenizer, substring()

- public String[] split(String regex);

   regex를 기준으로 문자열을 구분해서 배열로 출력 구분된 문자열의 길이가 0이면 빈 공백 반환

String str = "My;;name;is;DS";
String regex = ";";
int limit = 0;

String[] words = str.split(regex);

for (String word : words){
    System.out.println(word);
}

//My
//
//name
//is
//DS

- public String[] split(String regex, int limit);

   - regex : 문자열을 구분하기 위한 정규 표현. 문자열 구분의 기준.

   - limit : 분류할 문자열의 수.

      - limit == 0

         구분된 문자열의 길이가 0인 것은 무시된다.

String str = "My;;name;is;DS;;;;";
String regex = ";";
int limit = 0;
String[] words = str.split(regex, limit);

for (String word : words){
    System.out.println(word);
}
        

//My
//
//name
//is
//DS

      - limit > 0

         배열의 최대 개수는 limit를 넘지 못한다.

         구분된 문자열의 길이가 0인 것도 포함한다.

         ex. 분류할 단어가 10개일 때, limit가 5 이상이면 5개만 구분하고 나머지는 통째로 출력

String str = "My;;;name;is;DS;;;;";
String regex = ";";
int limit = 3;

String[] words = str.split(regex, limit);

for (String word : words){
    System.out.println(word);
}

//My
//
//;name;is;DS;;;;

      - limit < 0

         구분된 문자열의 길이가 0인 것도 포함한다.

- Throws : PatternSyntaxException(정규표현식의 패턴이 유효하지 않을 때 발생)

 

1-2. java.util.StringTokenizer

- 3가지 메소드

   - int countTokens()

      마지막으로 토큰을 읽어오기 전 남아있는 토큰의 수

   - boolean hasMoreTokens()

      토큰이 남아있으면 true, 없으면 false return

   - String nextToken()

      토큰 읽어오기

- 빈칸인 것은 포함하지 않는다.

String str = "Hello,,my,address,is,xxx@gmail.com";

StringTokenizer tokens = new StringTokenizer(str, ",");

//방법 1
while(tokens.hasMoreElements()){
	System.out.println(tokens.nextToken());
}

//방법 2
int cnt = tokens.countTokens();
for(int i=0; i<cnt; i++){
	System.out.println(tokens.nextToken());
}

//Hello
//my
//address
//is
//xxx@gmail.com
// 두 개 이상의 구분 문자열
StringTokenizer tokens = new StringTokenizer(str, ",@.");

while(tokens.hasMoreElements()){
	System.out.println(tokens.nextToken());
}

//Hello
//my
//address
//is
//xxx
//gmail
//com
// 두 개 이상의 구분 문자열 (false)
StringTokenizer tokens = new StringTokenizer(str, ",@.", false);

while(tokens.hasMoreElements()){
	System.out.println(tokens.nextToken());
}

//Hello
//my
//address
//is
//xxx
//gmail
//com
// 두 개 이상의 구분 문자열 (true : regex까지 출력)
StringTokenizer tokens = new StringTokenizer(str, ",@.", true);

while(tokens.hasMoreElements()){
	System.out.println(tokens.nextToken());
}

//Hello
//,
//,
//my
//,
//address
//,
//is
//,
//xxx
//@
//gmail
//.
//com

 

 

1-3. java.lang.String.substring()

- public String substring(start);

   문자열의 start 위치부터 끝까지 문자열 자르기

- public String substring(start, end);

   문자열의 start 위치부터 end 전까지 문자열 발췌

 

split() StringTokenizer substring()
- String 클래스의 메소드
- 추출한 문자열을 String[] 배열로 저장
- 빈 값 처리 가능
- java.util에 포함된 클래스
- 빈값은 무시하고 처리 
- String 클래스의 메소드
- 문자열이 아닌 index 기준으로 문자열 자르기

 

2. java.lang.String.trim()

- public String trim();

- 문자열 앞 뒤 공백 제거

 

 

코드

import java.lang.*;

class Solution {
    public String solution(String s) {
        String answer = "";
        
        String[] arr = s.split("\\s",-1);
        
        for(int i=0;i<arr.length; i++){
            for(int j=0; j<arr[i].length();j++){
                if(j%2==0)
                    answer += Character.toString(Character.toUpperCase(arr[i].charAt(j)));
                else
                    answer += Character.toString(Character.toLowerCase(arr[i].charAt(j)));
            }
            answer+=" ";
        }
        
        return answer.substring(0, answer.length()-1);
    }
}