[프로그래머스] 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(): 문자열 자료형으로 변환