Day5 - 코드 처리하기
📌 문제 정보
- 문제 이름 : 코딩 기초 테스트 - 코드 처리하기
- 문제 링크: 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 문법 정리 -->
- .