코드 처리하기 - LV.0
문제
- 문자열 code가 매개변수로 주어집니다.
- 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으로 바꿉니다.
- mode가 0일 때
- code를 통해 만들어진 ret를 출력하는 문제입니다.
- 단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.
테스트 (인텔리제이)
- 우선 문자열의 문자 중에서 1에 따른 mode 변화와 인덱스 값에 따라 문자를 추가해야 하는 조건이 있기 때문에 for문을 이용하여 문자열의 문자를 하나씩 꺼내려고 합니다.
- for문은 code의 크기만큼 반복하도록 설정하고
- charAt() 메서드를 이용하여 code의 문자를 하나씩 꺼내줍니다. (charAt()은 괄호에 원하는 문자가 위치한 인덱스 번호를 넣어주면 해당 문자가 반환됩니다.)
- 처음에는 mode에 따라 계산 방법이 달라지기 때문에 mode값 부터 결정할 수 있게 해줘야 합니다.
- 그래서 if문으로 charAt의 값이 문자 1이면 mode를 0이면 1, 1이면 0로 변경시켜줍니다.
- 대신 문자 1에 대한 연산은 하면 안되기 때문에 continue로 mode의 연산이 끝나면 for문의 다음으로 넘어가도록 해줍니다.
- 이제 mode에 따른 연산에 대한 if문이 필요합니다. 첫 번째 if문에는 mode가 0이고 code의 인덱스 값이 짝수이면 answer에 code의 charAt 값을 더해주도록 하고
- 두 번째 else if문에는 mode가 1이고 code의 인덱스 값이 홀수이면 answer에 code의 charAt 값을 더해주도록 해줍니다.
- 마지막으로 반환되는 부분에 answer가 빈 문자열이면 EMPTY를 넣어주도록 하면 해결할 수 있습니다.
- 두 번째 코드는 다른 사람 풀이 중에서 깔끔한 풀이가 있어 가져와 봤습니다.
- for문은 동일하게 작성하고 그 안에서 code를 charAt으로 꺼낸 문자를 char타입 c에 저장하도록 합니다.
- if문으로 c가 문자 1이면 mode를 0이면 1, 1이면 0으로 변경시켜주고 continue로 for문 다음 인덱스로 넘어가도록 해줍니다.
- mode 연산을 위한 if문 다음으로 if문을 설정합니다. 해당 if문은 for문의 현재 인덱스 번호를 2로 나눴을 때 mode와 일치하면 answer에 c를 담아주도록 해주면 해결할 수 있습니다.
package com.namji.codingtest;
public class 코드_처리하기 {
public static void main(String[] args) {
/*
문자열 code가 매개변수로 주어집니다.
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를 출력하는 문제입니다.
단, 시작할 때 mode는 0이며, return 하려는 ret가 만약 빈 문자열이라면 대신 "EMPTY"를 return 합니다.
제한사항
- 1 ≤ code의 길이 ≤ 100,000
- code는 알파벳 소문자 또는 "1"로 이루어진 문자열입니다.
입출력 예
code result
"abc1abc1abc" "acbac"
"abcdef" "ace"
"abc11abc" "acb"
"11111" "EMPTY"
"1a1b1c" "abc"
입출력 설명
#1
code의 각 인덱스 i에 따라 다음과 같이 mode와 ret가 변합니다.
i code[i] mode ret
0 "a" 0 "a"
1 "b" 0 "a"
2 "c" 0 "ac"
3 "1" 1 "ac"
4 "a" 1 "ac"
5 "b" 1 "acb"
6 "c" 1 "acb"
7 "1" 0 "acb"
8 "a" 0 "acba"
9 "b" 0 "acba"
10 "c" 0 "acbac"
따라서 "acbac"를 return 합니다.
*/
// String code = "1a1b1c";
// int mode = 0;
// StringBuilder answer = new StringBuilder();
//
// for (int i = 0; i < code.length(); i++) {
// if (code.charAt(i) == '1') {
// mode = mode == 0 ? 1 : 0;
// continue;
// }
// if (mode == 0 && i % 2 == 0) {
// answer.append(code.charAt(i));
// } else if (mode == 1 && i % 2 != 0) {
// answer.append(code.charAt(i));
// }
// }
// if (answer.isEmpty()) {
// answer.append("EMPTY");
// }
//
// System.out.println(answer);
String code = "abc1abc1abc";
int mode = 0;
StringBuilder answer = new StringBuilder();
for (int i = 0; i < code.length(); i++) {
char c = code.charAt(i);
if (c == '1') {
mode = mode == 0 ? 1 : 0;
continue;
}
if (i % 2 == mode) {
answer.append(c);
}
}
System.out.println(answer.isEmpty() ? "EMPTY" : answer);
}
}
프로그래머스 코드
// class Solution {
// public StringBuilder solution(String code) {
// int mode = 0;
// StringBuilder answer = new StringBuilder();
// for (int i = 0; i < code.length(); i++) {
// if (code.charAt(i) == '1') {
// mode = mode == 0 ? 1 : 0;
// continue;
// }
// if (mode == 0 && i % 2 == 0) {
// answer.append(code.charAt(i));
// } else if (mode == 1 && i % 2 != 0) {
// answer.append(code.charAt(i));
// }
// }
// if (answer.length() == 0) {
// answer.append("EMPTY");
// }
// return answer;
// }
// }
// class Solution {
// public String solution(String code) {
// int mode = 0;
// StringBuilder answer = new StringBuilder();
// for (int i = 0; i < code.length(); i++) {
// char c = code.charAt(i);
// if (c == '1') {
// mode = mode == 0 ? 1 : 0;
// continue;
// }
// if (i % 2 == mode) {
// answer.append(c);
// }
// }
// return answer.length() == 0 ? "EMPTY" : answer.toString();
// }
// }
class Solution {
public StringBuilder solution(String code) {
int mode = 0;
StringBuilder answer = new StringBuilder();
for (int i = 0; i < code.length(); i++) {
char c = code.charAt(i);
if (c == '1') {
mode = mode == 0 ? 1 : 0;
continue;
}
if (i % 2 == mode) {
answer.append(c);
}
}
return answer.length() == 0 ? answer.append("EMPTY") : answer;
}
}
'Coding Test > Java Coding Test' 카테고리의 다른 글
[프로그래머스 / 자바] - OX퀴즈 (2) | 2024.09.28 |
---|---|
[프로그래머스 / 자바] - 연속된 수의 합 (2) | 2024.09.27 |
[프로그래머스 / 자바] - PCCE 기출문제 1번 문자 출력 (1) | 2024.09.25 |
[프로그래머스 / 자바] - 예산 (5) | 2024.09.24 |
[프로그래머스 / 자바] - 등수 매기기 (2) | 2024.09.23 |