[프로그래머스-기초] 코드 처리하기

JE·2024년 1월 10일
0

코테/코플릿

목록 보기
47/57

코드 처리하기

문제 설명

문자열 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를 return 하는 solution 함수를 완성해 주세요.

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

제한사항

1 ≤ code의 길이 ≤ 100,000
code는 알파벳 소문자 또는 "1"로 이루어진 문자열입니다.
입출력 예

coderesult
"abc1abc1abc""acbac"

입출력 예 설명

입출력 예 #1
code의 각 인덱스 i에 따라 다음과 같이 mode와 ret가 변합니다.

icode[i]moderet
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 합니다.

※ 2023년 05월 18일 지문이 수정되었습니다.

💻 내가 작성한 코드

function solution(code) {
    let result = '';
    let mode = 0;
  
    for(let i = 0; i < code.length; i++){
        if(mode === 0){
            if(code[i] !== '1' && i % 2 === 0){result += code[i]}
            if(code[i] === '1') {mode = 1}
        } else if(mode === 1){
            if(code[i] !== '1' && i % 2 !== 0){result += code[i]}
            if(code[i] === '1') {mode = 0}
        }

    }

    return result.length === 0 ? 'EMPTY' : result;

}

초반에 문제를 풀었는데 케이스 두개가 자꾸 실패 했다고 표시 되었다.

다른 사람들의 질문을 보니 ret가 빈문자열인 경우를 작성하지 않아서 였다.

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

이래서 한국말은 끝 까지 봐야한다...ㅎ

답을 반환할 result와 mode를 선언해 줬다.

for문으로 문자를 순환하고
mode의 값에 따라 조건을 다르게 줬다.

더물어 code[i]가 '1'이 아니고 홀수인 경우, 짝수인 경우 reulst에 code[i]요소를 추가했다.

마지막으로 result의 길이가 0인 경우 'EMPTY'를 아닌 경우 result를 반환했다.

🛠️ 조금 다르게 작성해 보기

function solution(code) {
    let result = '';
    let mode = 0;
    
    for(let i in code){
        if(code[i] === '1'){
            mode = mode === 0 ? 1 : 0
        } 
        if(code[i] !== '1'){
            if(mode === 0 && i % 2 === 0){
                result += code[i]
            } 

            if(mode === 1 && i % 2 !== 0){
                result += code[i]
            }
        }  
    }
    
    return result.length === 0 ? 'EMPTY' : result;
    
}
  • for...in 문으로 간결하게 작성했다.
  • code[i]가 '1'인 경우와 아닌 경우를 먼저 조건을 줘 mode의 값을 다르게 할당했다.
  • 마지막으로 result.length === 0이 아닌 result.length > 0으로 표시해

💻 다른 사람이 작성한 코드

function solution(code) {
    var answer = code.replaceAll("1","").split("").filter((val, idx)=> idx%2 === 0).join("");
    return answer.length > 0 ? answer : "EMPTY";
}

다른 분들의 코드는 나와 비슷하지만
이분은 진짜 다른 방식으로 문제를 푸셔서 가져와 봤다.

코드를 어떻게 풀어가는지 이해했지만 이게 왜 성공되었는지 아직도 잘 모르겠다.

문제를 다시 읽어봐야겠다.

function solution(code) {
    let odd = false
    return Array.from(code).reduce((acc, v, i) => {
        if (v === '1') {
            odd = !odd
            return acc
        }
        return (i % 2 === (odd ? 1 : 0)) ? acc + v : acc
    }, '') || 'EMPTY'
}

이분은 mode를 boolean 값으로 사용하고 배열의 형태로 reduce를 사용하셨다.

profile
[프론트 애송이] 작은 깨달음도 기록하기

0개의 댓글