본문 바로가기
카테고리 없음

[프로그래머스] 코드 처리하기 : JavaScript

by dygreen 2024. 4. 21.
반응형

📌 문제

 

📌 풀이

처음 시도한 풀이 (오답)

function solution(code) {
    let ret = "";
    let mode = 0;
    for (let idx = 0; idx < code.length; idx++) {
        if (mode === 0) {
            if (code[idx] !== "1") {
                if (idx % 2 === 0) {
                    ret += code[idx];
                }
            } else {
                mode = 1;
            }
        }
        if (mode === 1) {
            if (code[idx] !== "1") {
                if (idx % 2 !== 0) {
                    ret += code[idx];    
                }
            } else {
                mode = 0;
            }
        }
    }
    
    return ret === "" ? "EMPTY" : ret
}
  • if 문을 사용해 문제에 맞게 조건문을 설계했다고 생각했는데 오답이었다.
    입력값 "abc1abc1abc" 를 넣었을 때, "acbac" 가 나와야 하는데 "acacac" 가 나왔다.

 

정답

function solution(code) {
    let ret = "";
    let mode = 0;
    for (let idx = 0; idx < code.length; idx++) {
        if (mode === 0) {
            if (code[idx] !== "1") {
                if (idx % 2 === 0) {
                    ret += code[idx];
                }
            } else {
                mode = 1;
                continue;
            }
        } else {
            if (code[idx] !== "1") {
                if (idx % 2 !== 0) {
                    ret += code[idx];    
                }
            } else {
                mode = 0;
                continue;
            }
        }
    }
    
    return ret === "" ? "EMPTY" : ret
}
  • 위의 오답과 정답이 차이가 무엇인지 몰랐던 나의 부족한 기초 지식을 탓하며🥲 .. 차이점을 정리해보려고 한다..
  • 위 함수를 실행하면, 첫 번째 if 문에서 mode 가 변경이 되어도 같은 인덱스에서의 if 문을 계속해서 평가하므로
    mode 변경 즉시 그에 따른 로직 변경이 적용되지 않는 문제가 있던 것이다.
    아래 함수에서는 else 를 사용하여 mode 가 1일 때의 로직을 별도로 처리하므로,
    mode 가 변경되는 즉시 그 인덱스에서부터 새로운 mode 에 따른 처리가 시작된다.
  • 즉, mode 의 변경이 적용되는 타이밍의 차이 때문에 두 함수의 결과값이 다른 것이다.

 

또 다른 정답 (if 문을 2개 쓰고 싶을 경우)

function solution(code) {
    let ret = "";
    let mode = 0;
    for (let idx = 0; idx < code.length; idx++) {
        if (mode === 0) {
            if (code[idx] !== "1") {
                if (idx % 2 === 0) {
                    ret += code[idx];
                }
            } else {
                mode = 1;
                continue;
            }
        }
        if (mode === 1) {
            if (code[idx] !== "1") {
                if (idx % 2 !== 0) {
                    ret += code[idx];    
                }
            } else {
                mode = 0;
                continue;
            }
        }
    }
    
    return ret === "" ? "EMPTY" : ret
}
  • if 문 내에서 continue 를 사용하면 옳은 결과값을 도출할 수 있다
  • continue : 반복문 내에서 사용되며, 현재 반복의 나머지 부분을 건너뛰고 반복문의 다음 순환으로 즉시 이동하게 된다.
    for / while 반복문 내에서 특정 조건을 만족하는 경우, 그 조건에 따른 처리를 완료하고 반복문의 나머지 부분을 실행하지 않고
    다음 반복문으로 넘어가기 위해 사용할 수 있다.
  • 즉, mode 가 변경된 후에 그 변경을 즉시 적용하기 위해 현재 반복문의 남은 부분을 건너뛰고,
    다음 인덱스에서 새로운 mode 로 문자를 처리하도록 설계된 코드가 된다. (mode 의 변경이 바로 그 순간에 효과를 발휘)
728x90

댓글