100세까지 코딩
[프로그래머스] Lv0.코드 처리하기 본문
문제 설명
풀기 전 생각
- 문제 설명이 너무 상세히 나와 쉽게 따라했다
- charAt(), String.length(), String.equals() 사용하는 것을 익히는 문제라고 생각했다.
class Solution {
public String solution(String code) {
String answer = "";
int mode = 0;
String ret = "";
for(int i = 0; i < code.length(); i++){
if(mode == 0){ // mode가 0일때
if(code.charAt(i)=='1'){ // 1이면 mode 바꾸기
mode = 1;
}else{
if(i%2==0){ // 짝수면
ret += code.charAt(i);
}
}
}else{ // mode가 1일때
if(code.charAt(i)=='1'){
mode = 0;
}else{
if(i%2!=0){ // 홀수면
ret += code.charAt(i);
}
}
}
}
if(ret.equals("")){ // 빈 값이면
ret = "EMPTY";
}
answer = ret;
return answer;
}
}
오류 및 개선
- 물론 쉽게 오류없이 풀었지만 왜 난이도가 높은편인지 의아했다
- 모범 답안을 보니 뒤통수를 맞은듯 했다...
- 가독성과 성능이 좋은 모범 답안을 소개하려한다.
모범 답안
class Solution {
public String solution(String code) {
StringBuilder answer = new StringBuilder(); // String을 대신하여 성능, 메모리 up
int mode = 0;
for (int i = 0; i < code.length(); i++) {
char current = code.charAt(i);
if (current == '1') {
mode = mode == 0 ? 1 : 0; // 삼항연산자로 가독성 up
continue;
}
if (i % 2 == mode) { // mode가 1이면 홀수만 더하기, 0이면 짝수만 더하기
answer.append(current); // append라는 메소드 사용
}
}
return answer.length() == 0 ? "EMPTY" : answer.toString(); // 빈값이면 EMPTY 반환
}
}
참고
String은 변경 불가능한 클래스이므로 문자열 수정이 많을땐 지양하자.
성능 저하, 메모리 낭비를 초래하기 때문이다.
String vs StringBuffer vs StringBuilder
'코딩테스트 > 자바' 카테고리의 다른 글
[프로그래머스] Lv0.배열 만들기 2 (0) | 2023.08.29 |
---|---|
[프로그래머스] Lv0.저주의 숫자 3 (0) | 2023.08.27 |
[프로그래머스] Lv0.배열 조각하기 (0) | 2023.08.27 |
[프로그래머스] Lv0.주사위 게임 (0) | 2023.08.26 |
[프로그래머스] Lv0.정수를 나선형으로 배치하기 (0) | 2023.08.25 |