[프로그래머스] Level 0 코드 처리하기

 

 

 

문제

문자열 code가 주어집니다. code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다. mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다. mode는 0과 1이 있으며, i를 0부터 code의 길이 - 1까지 1씩 키워나가면서 code[i] 값에 따라 다음과 같이 행동합니다.

 

  • mode = 0일 때
    code[i]가 "1"이 아니면 i가 짝수일 때만 ret의 맨 뒤에 code[i]를 추가합니다.
    code[i]가 "1"이면 mode를 0에서 1로 바꿉니다.
  • mode = 1일 때
    code[i]가 "1"이 아니면 i가 홀수일 때만 ret의 맨 뒤에 code[i]를 추가합니다.
    code[i]가 "1"이면 mode를 1에서 0으로 바꿉니다.


문자열 code를 통해 만들어진 문자열 ret를 return 하는 solution 함수를 완성해 주세요.
단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.

 

 

 

 

나의 답안

 

조건에 맞게 mode가 1일 때와 0일 때, code[i]가 1일 때 등 if 조건문을 달아 작성하였으며,

StringBulider 변수를 선언하여 문자를 추가하도록 하였다.

 

 

class Solution {
    public String solution(String code) {
        StringBuilder temp = new StringBuilder();
        int mode = 0;

        for (int i=0; i<code.length(); i++) {
            if (mode == 0) {
                if (code.charAt(i) == '1') {
                    mode += 1;
                } else if (code.charAt(i) != '1') {
                    if (i%2 == 0) {
                        temp.append(code.charAt(i));
                    }
                }
            } else if (mode == 1) {
                if (code.charAt(i) == '1') {
                    mode -= 1;
                } else if (code.charAt(i) != '1') {
                    if (i%2 != 0) {
                        temp.append(code.charAt(i));
                    }
                }
            }
        }
        String ret = temp.toString();
        return ret.isEmpty() ? "EMPTY" : ret;
    }
}

 

 

 

 

 

모범 답안

class Solution {
    public String solution(String code) {
        StringBuilder answer = new StringBuilder();
        int mode = 0;
        for (int i = 0; i < code.length(); i++) {
            char current = code.charAt(i);
            if (current == '1') {
                mode = mode == 0 ? 1 : 0;
                continue;
            }

            if (i % 2 == mode) {
                answer.append(current);
            }
        }
        return answer.length() == 0 ? "EMPTY" : answer.toString();
    }
}
  • 홀수와 짝수 구분을 mode를 이용해 작성함으로써 중첩 if문 사용 방지
  • 문자가 '1'일 때, mode 전환 또한 삼항연산자를 사용하여 한번에 작성
  • 마지막 return 시 새로운 변수 선언 없이 바로 toString을 통해 StringBulider 변수를 리턴 

 

 

중첩 if문을 사용하지 않음으로써 훨씬 코드가 간결하고 가독성이 좋아졌다.

더 가독성을 높이고 효율성을 높일 수 있는 코딩이 있을지 항상 생각하며 코딩하면 좋을 듯하다.

 

 

복습

      문자열(String)

  • String.charAt(인덱스) : 해당 인덱스에 위치한 문자값을 리턴
  • String.isEmpty(): 해당 문자열이 비어있는지 확인

 

      StringBuilder

  • sb.append(문자열): 해당 문자열을 새로 추
  • sb.insert(인덱스, 문자열): 해당 위치에 문자열을 삽입 (해당 위치의 문자열을 뒤로 밀어 삽입)
  • sb.toString(): 문자열 자료형으로 변환