코딩테스트(Level 0~1)

[JAVA, Programmers] 이상한 문자 만들기(자바)

justdoIT0730 2022. 11. 24. 13:33
728x90
728x90

1. 문제 설명

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

 

2. 제한 사항

문자열 전체의 /홀수 인덱스가 아니라, 단어(공백을 기준)별로 /홀수 인덱스를 판단해야합니다.

번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

 

3. 입출력

s return
"try hello world" "TrY HeLlO WoRlD"

 

4. 입출력 설명

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

 

class Solution {
    public String solution(String s) {
        String answer = "";

        s= s.trim();
        for(int i =0; i<s.length(); i++) {s = s.replaceAll("  ", " ");	}		//1

		String[] a = s.split(" ");

		char cnt;

		for (int i = 0; i < a.length; i++) {					//2
			for (int y = 0; y < a[i].length(); y++) {
				int t = a[i].charAt(y);
				if (y % 2 == 0) {
					if (96 < t&&t<123) {
						t -= 32;
						cnt = (char) t;
						answer += cnt;
					} else {
						cnt = (char) t;
						answer += cnt;
					}
				} else {
					if (64<t&&t < 91) {
						t += 32;
						cnt = (char) t;
						answer += cnt;
					} else {
						cnt = (char) t;
						answer += cnt;
					}
				}

			}
			answer += " ";							//3
		}
		answer = answer.trim();
        return answer;
    }
}

5. 풀이(오답)

//1 

문자 s 내 2개 이상의 공백을 1개의 공백으로 치환 + 문자열 맨 앞, 뒤의 공백을 제거

앞 뒤의 공백이 없고 각 문자 사이에 한 개의 공백만 가지도록 한 s를 공백을 기준으로 배열 a에 저장

 

//2 

아스키코드를 이용해 대문자 범위 : 64 < t < 91 / 소문자 범위 : 96 < t < 122를 기준으로 32만큼 더하고 빼서 answer에 추가 

마지막에 공백 추가

 

//3 

맨 마지막 문자 뒤에 존재하는 공백 제거

 

너무 아스키 코드를 이용하고자 불필요한 줄이 많았고,

무엇보다 테스트 케이스를 이클립스 내에서 여러 차례 해보았으나 최종적으로 통과하지 못하는 결과가 나왔다... 

toUpperCase(), toLowerCase() 을 사용해서 다시 해보도록 하자...

 

6. 재풀이(오답)

class Solution {
    public String solution(String s) {
        String answer = "";
        for (int i = 0; i < s.length(); i++) {
			s = s.replace("  ", " ");
		}
		s = s.trim();
        
		String[] a = s.split(" ");
		for (int i = 0; i < a.length; i++) { 
			int cnt = 0;
			for (int t = 0; t < a[i].length(); t++) {
				if (t % 2 == 0) {
					answer += a[i].substring(cnt, cnt + 1).toUpperCase();
					cnt++;
				} else {
					answer += a[i].substring(cnt, cnt + 1).toLowerCase();
					cnt++;
				}
			}
			answer += " ";
		}
        
        answer = answer.trim();
        return answer;
    }
}

1번째 풀이에서 toUpperCase() 와 toLowerCase()를 사용하여 보다 간결한 코딩이 되었다.

하지만 여전히 테스트 케이스에서 통과가 안 되었고, 지문을 몇번이고 다시 읽어보니,,

글자 사이에 있는 공백이 하나 이상일 수 있고 이를 그대로 살려서 변환해야했었다,,

지문 해석도 제대로 안하고 풀이에 들어가니 시간을 엄청 써도 답이 안 나오는 건 당연한 결과이다..

 

7. 최종 풀이

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

초반에 공백을 지우는 과정을 없애고 마지막에 answer +=" ";로 추가된 공백만 하나 지워준다면 

처음 s에서 공백을 포함한 문자열 그대로 변환된 answer을 도출할 수 있었다..

 

문제 해석을 꼼꼼히 해야겠다..!

 

 

[공부 출처]

https://jamesdreaming.tistory.com/87

 

[ 자바 코딩 ] toLowerCase(), toUpperCase(), trim()

안녕하세요. 제임스 입니다. 이번 포스팅은 자바 String 관련 함수 중 영문자를 전부 대문자로 또는 소문자로 변경 하는 함수와 인자값으로 입력된 문자열의 앞뒤 공백을 제거 하는 함수에 대해

jamesdreaming.tistory.com

https://jamesdreaming.tistory.com/84

 

[ 자바 코딩 ] Java split() 함수로 문자열 자르기

안녕하세요. 제임스 입니다. 이번에는 Java 에서 String 을 다룰때 유용하게 사용할 수 있는 함수 중 한가지인 split 함수에 대해 알아 보겠습니다. ■ String[] split(String regex) split 함수는 입력받은 정

jamesdreaming.tistory.com

 

728x90
728x90