CODING TEST/programmers

Day5 - 코드 처리하기

iamyuunzo 2025. 7. 14. 08:22

📌 문제 정보

- 문제 이름 : 코딩 기초 테스트 - 코드 처리하기

- 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/181932

 

 

📌 문제 요약

핵심 조건: code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다. mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다.

mode는 0과 1이 있으며, idx를 0 부터 code의 길이 - 1 까지 1씩 키워나가면서 code[idx]의 값에 따라 다음과 같이 행동합니다.

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

문자열 code를 통해 만들어진 문자열 ret를 return 하는 solution 함수를 완성

단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return.

- 제한: 1 ≤ code의 길이 ≤ 100,000

 

 

📌 내 풀이 및 코드

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

        for (int i = 0; i < code.length(); i++) {
            char ch = code.charAt(i);

            if (ch == '1') {
                mode = (mode == 0) ? 1 : 0;
            } else {
                if (mode == 0 && i % 2 == 0) {
                    ret.append(ch);
                } else if (mode == 1 && i % 2 == 1) {
                    ret.append(ch); 
                }
            }
        }

        return ret.length() == 0 ? "EMPTY" : ret.toString();
    }
}

- 문제 자체를 이해하는데 좀 걸렸음. 문제에 대한 요약 정리를 해보자면, 

분류 mode = 0 mode = 1
글자 = 1 mode를 1로 바꿈 (0 -> 1) mode를 0으로 바꿈 (1 -> 0)
글자 != 1 인덱스(idx)가 짝수일 때만 ret에 추가 인덱스(idx)가 홀수일 때만 ret에 추가

 

예시) "abc1abc1abc" => 시작할 때 mode = 0

인덱스 문자 mode 과정 결과
i = 0 a mode = 0 짝수 / 글자 != 1 a 추가 (a)
i = 1 b mode = 0 홀수 pass
i = 2 c mode = 0 짝수 / 글자 != 1 c 추가 (ac)
i = 3 1 mode = 0 글자 = 1 mode = 1로 바뀜
i = 4 a mode = 1 짝수 pass
i = 5 b mode = 1 홀수 / 글자 != 1 b 추가 (acb)
i = 6 c mode = 1 짝수 pass
i = 7 1 mode = 1 글자 = 1 mode = 0로 바뀜
i = 8 a mode = 0 짝수 / 글자 != 1 a 추가 (acba)
i = 9 b mode = 0 홀수 pass
i = 10 c mode = 0 짝수 / 글자 != 1 c 추가 (acbac)

< 코드 풀이>

- StringBuilder은 결과 문자열 저장용

- char ch = code.charAt(i) i번째 글자를 가져온 후 바꿔야하니까 charAt(i) / for문으로 문자열을 한 글자씩 검사

- ch == '1' (모드 전환 트리거)  /  if (mode == 0 && ...) : 조건에 맞는 문자만 ret에 추가

- return "EMPTY"처리 : ret 비어있으면 EMPTY 리턴 (return ret.length() == 0 ? "EMPTY" : ret.toString();)

 

 

 

📌 다른 사람들 풀이

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();
    }
}

<-- 다른 풀이 요약 -->

- 1 : 내 코드에서 조금 더 간결한 버전 (continue로 흐름 정리 + 조건 간결화)

항목 내 코드 1번 코드
"1" 처리 if (ch == '1') { ... } else { ... }로 블록 나눔 if (current == '1') { continue; }로 일찍 넘김
조건식 if (mode == 0 && i % 2 == 0) { ... } else if (...) if (i % 2 == mode) → 한 줄로 표현
구조 깊이 중첩된 if문 구조 평평한 구조 (continue 덕분에 가독성↑)
변수 이름 ch, ret current, answer → 조금 더 의미 있는 이름

 



📌 새로 배운 문법

<-- 이번 문제에서 새로 배운 Java 문법 정리 -->

- .