자바 초급문제로 맨땅에 해딩하기

자바 초급문제 14. 이상한 문자 만들기

Jungsoomin :) 2020. 4. 8. 00:28

프로그래머스(https://programmers.co.kr/learn/courses/30/lessons/12930)

 

자바 초급 문제의 이상한 문자 만들기 이다.

 

코드는 간단하지만 이렇게 돌아가는데 3h가량 시간을 쏟았다. 고민을 많이했고 charAt을 안쓰고 string 타입으로 마무리하고 싶어서 split()메소드를 찾아봤다. 또한 향상된 for문을 실용적으로 사용하는 법과 삼항연산자를 어떻게하면 효과적으로 쓸지에 대해서 고민했다.

배열식으로 하나의 인덱스를 조사하는데 상당히 다양하게 쓰일 수 있다는 점을 느끼게 되었던 것 같다.

 

toLowerCase() 메소드와 toUpperCase() 메소드도 찾아서 적용시켜보았다. 삼항연산자에서 += 의 대입연산자 사용과 count+1 의 연산과정이 생각이 들지않아서 시간을 많이 소모하기도 했다. += , =만 생각할 것이 아니라 삼항연산자의 콜론 사이에서도 변수+1 이 가능하다는 것을 체감하게 되는 순간이었다.

 

배열에 대해 더 이해하게된 문제였다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package programmers_이상한문자만들기;
 
public class Example {
    public String solution(String s) {
        String answer = "";
        int count = 0;
        String[] saveList = s.split("");// 문자열 s를 다 나누어 대입
        /*
         * 공백 기준 문자의 짝,홀 순서를 파악하여 짝수는 대문자 홀수는 소문자로 변환한다. 0도 짝수다
         */
 
        for (String check : saveList) {
            count = (check.contains(" ")) ? 0 : count + 1;// 공백이면 0 아니면 1증가
            answer += (count % 2 == 0) ? check.toLowerCase() : check.toUpperCase();// 카운트의 숫자대로 홀짝을 나누면 %2의 결과는 오히려 반대값임
 
        }
 
        return answer;
    }
}
cs

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package 이상한문자만들기;
 
import java.util.*;
 
public class SubClass {
    public String Solution(String s) {
        String empty = " ";
        String answer = "";
        char checkWord; // charAt 용 변수
        // s 는 하나이상의 단어이다.
        // s 의 각 단어는 공백을 기준으로 나누어져있다.
        // 각단어 기준 짝수번째 알파벳은 대문자 홀수 번쨰 알파벳은 대문자
        // 그 이후에 리턴 하는게 answer이다.
 
        // 공백기준 단어 별로 짝 홀 수 인덱스를 파악해야한다.
        // 첫번쨰 글자는 0 번인덱스로 보아 짝수번째 알파벳이된다. 즉 0,1,2 순이라는 이야기임.
 
        // split 메소드 사용해서 공백을 기준으로 문자를 자를 수 있음.
        String[] cuttedLine = s.split(" "); // 공백을 기준으로 문자열 커트. 이제 배열에 인덱스 값으로 나누어 졌을 것이다.
        // 이제 각문자를 꺼내서 대문자로직에 집어넣자.char 를 이용해서 가자.
        for (int i = 0; i < cuttedLine.length; i++) {// 일단 첫번째 인덱스 길이만큼 돈다. 즉 자른 단어들 만큼 돌것이다.
            for (int j = 0; j < cuttedLine[i].length(); j++) {// 나누어져 있는 인덱스 조사
 
                // 추출글자가 0번째 인덱스거나 , %2=0 일때에 즉 짝수일떄에. 대문자로 바꾼다. 1이거나 %2=0이 아닐때는 소문자로 바꾼다.
                if (j % 2 == 0) {// j의 길이가 짝수 일때 즉 짝수번째 글자일 때에 그 글자가 소문자라면
                    checkWord = cuttedLine[i].charAt(j); // 그 문자를 추출해서 변수에 넣고
                    answer += cuttedLine[i].valueOf(checkWord).toUpperCase();// 그 수를 대문자로 집어넣어줌
                } else if (j % 2 != 0) { // 즉 홀수 일 경우에. 소문자를 넣는다.
                    checkWord = cuttedLine[i].charAt(j);
                    answer += cuttedLine[i].valueOf(checkWord).toLowerCase();
                } else if (j == 0) {// 0 번째 숫자면 그냥 대문자를 집어넣는다.
                    checkWord = cuttedLine[i].charAt(j);
                    answer += cuttedLine[i].valueOf(checkWord).toUpperCase();
                }
 
            } // 안의 for문이 다돌면 하나의 단어가 answer에 들어갈 것임. 대문자로 입력받아도 잘 계산 함.
            if (!(answer.length() == s.length())) {// 답과 s의 길이가 같지않다면
                answer += " "// <<이게 문제였던 것은 확실함. 좀더 견고하게 잡아야할 듯. 아직 경우의 수와 맞을 경우의 수를 더 고려해봐야 함.
            } else {
                break;
            }
        } // 이제 남은 경우의 수는 중복 띄어쓰기 뿐임.
 
        return answer;
    }
}
 
cs

로직을 엎기 전까지의 코드이다.

 

겉보기에는 ...음 뚝딱 같아도..쉽지가 않은 과정이였어서 개인적으로 뿌듯하다 :)