본문 바로가기

프로그래머스 코딩(자바)/Level 1

Programmers Level 1 - 이상한 문자 만들기

728x90

문제 설명

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

제한 사항
  • 문자열 전체의 짝/홀수 인덱스가 아니라, 단어(공백을 기준)별로 짝/홀수 인덱스를 판단해야합니다.
  • 첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.
입출력 예
s return
"try hello world" "TrY HeLlO WoRlD"

입출력 예 설명

"try hello world"는 세 단어 "try", "hello", "world"로 구성되어 있습니다. 각 단어의 짝수번째 문자를 대문자로, 홀수번째 문자를 소문자로 바꾸면 "TrY", "HeLlO", "WoRlD"입니다. 따라서 "TrY HeLlO WoRlD" 를 리턴합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
    public String solution(String s) {
        String answer = "";
        int cnt = 0;
        for (char c : s.toCharArray()) {
            if (c == ' ') {
                answer += " ";
                cnt = 0;
            } else {
                if (cnt % 2 == 0)
                    answer += (c + "").toUpperCase();
                else
                    answer += (c + "").toLowerCase();
                cnt++;
            }
        }
        return answer;
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
    public String solution(String s) {
        String answer = "";
        int cnt = 0;
        for (char c : s.toCharArray()) {
            if (c == ' ') {
                answer += " ";
                cnt = 0// 새로운 단어 시작
            } else {
                if (cnt % 2 == 0)
                    answer += Character.toUpperCase(c);
                else
                    answer += Character.toLowerCase(c);
                cnt++// 단어마다 카운팅
            }
        }
        return answer;
    }
}
cs

 

 문자를 1글자씩 반복하며 공백은 그대로 짝수 번째는 대문자로 홀수 번째는 소문자로 바꿔 더하기 했습니다.

 

1
2
3
4
5
6
7
8
9
10
11
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
class Solution {
    public String solution(String s) {
        AtomicInteger index = new AtomicInteger(0);
        return s.chars().mapToObj(v->{
            index.set((v ==' ') ? 0 : index.get()+1);
            return (index.get()%2!=0) ? ((char)v+"").toUpperCase() : ((char)v+"").toLowerCase();
        }).collect(Collectors.joining());
    }
}
cs

 

 String을 intStream으로 만들어 처리해 보았다.

 map()에서 외부 지역 변수를 접근하기 위하여 스레드에 안정적인 AtomicInteger를 사용해야 한다.

AtomicInteger set()은 변경, get()은 얻기 이다.

공백일 경우 -1로 만들고 아니면 1을 증가시켰다. 새로운 단어의 index값이 0부터 증가되어야 하므로 -1로 초기화 함

 

728x90