코드 출력하기
https://school.programmers.co.kr/learn/courses/30/lessons/181932
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
조건에 따라 모드를 변환하여 조건에 맞는 인덱스 값을 담아 출력하는 문제입니다. 처음 제출한 코드는 문제에서 말하는 요구사항을 그대로 조건문과 반복문을 통해 풀이 작성을 한 코드입니다. 두번째 코드는 답안 제출 후 마음에 드는 다른 사람의 풀이를 참고하였습니다.
처음 제출한 코드
function solution(code) {
let [ arr, mode, ret ] = [code.split(""), false, [] ];
for (let idx = 0; idx < arr.length; idx++){
if (!mode) {
if (arr[idx] === "1") { mode = true };
if ((arr[idx] !== "1") && (idx%2 === 0)) {
ret.push(arr[idx]);
}
} else {
if (arr[idx] === "1") { mode = false };
if ((arr[idx] !== "1") && (idx%2 === 1)) {
ret.push(arr[idx]);
};
}
}
ret = ret.join('')
if(ret === "") return "EMPTY";
return ret;
}
1. 변수 초기화
let [ arr, mode, ret ] = [ code.split(""), false, [] ];
- arr: code.split("")를 사용하여 문자열 code를 한 글자씩 요소로 가지는 배열로 만듭니다.
- mode: 초기값은 0입니다. 자바스크립트에서는 0과 1을 false와 true인 boolean값을 사용할 수 있기 때문에 편의상 boolean으로 사용하였습니다. 두 가지 상태를 전환하는 역할을 합니다.
- ret: 선택된 문자들을 저장할 빈 배열입니다.
2. for 반복문
for (let idx = 0; idx < arr.length; idx++){
// ... 내부 로직 ...
}
- 문자열의 모든 인덱스를 순회하며 각 문자를 확인합니다.
3. mode값에 따른 문자 선택
문제에서는 mode값을 0,1로 정의했지만 자바스크립트 특성상 boolean값으로 변경하여도 상관없습니다. 반복문 내에서 조건에 따라 두 가지 경우로 나누어 처리합니다.
a. 일반 모드 (mode === false)
if (!mode) {
if (code[idx] === "1") {
mode = true; // '1'을 만나면 모드를 전환
}
if ((code[idx] !== "1") && (idx % 2 === 0)) {
ret.push(code[idx]); // '1'이 아니면서 인덱스가 짝수면 선택
}
}
- 모드 전환: 만약 현재 문자가 '1'이면, 모드를 true로 전환합니다.
- 문자 선택: 현재 문자가 '1'이 아니고, 인덱스가 짝수(idx % 2 === 0)이면 해당 문자를 ret 배열에 추가합니다.
b. 변환 모드 (mode === true)
else {
if (code[idx] === "1") {
mode = false; // '1'을 만나면 모드를 다시 일반 모드로 전환
}
if ((code[idx] !== "1") && (idx % 2 === 1)) {
ret.push(code[idx]); // '1'이 아니면서 인덱스가 홀수면 선택
}
}
- 모드 전환: 현재 문자가 '1'이면, 모드를 false로 전환합니다.
- 문자 선택: 현재 문자가 '1'이 아니고, 인덱스가 홀수(idx % 2 === 1)이면 해당 문자를 ret 배열에 추가합니다.
4. 결과 문자열 반환
ret = ret.join('');
if(ret === "") return "EMPTY";
return ret;
- ret.join('')로 배열을 다시 문자열로 만듭니다.
- 만약 결과 문자열이 빈 문자열이라면 "EMPTY"를 반환합니다. 아니면 생성된 문자열을 반환합니다.
문제에서 요구사항은 각 인덱스에서 mode값이 1인지 0인지에 따라 값을 담는 것이었습니다. 들어오는 테스트코드들을 생각했을 때 mode는 제거해도 되는 조건 같아 보입니다. 알고리즘에서 말하는 조건 다음으로 결과값에 집중하여 코드를 변경해보았습니다.
두번째 풀이 코드
- 결과값에 영향을 주지 않는 조건 제거하기
문자열 내 '1'을 제거하는 로직을 더 간단하게 처리할 수 있습니다. replaceAll("1", "")를 사용하여 문자열 전체에서 '1'을 제거합니다. - filter함수로 ret에 담을 요소 직관적으로 바꾸기
제거 후 남은 문자열을 배열로 바꾼 뒤, filter 함수를 이용해 인덱스가 짝수인 요소만 선택하면 됩니다.
function solution(code) {
var answer = code.replaceAll("1","")
.split("")
.filter((value, idx) => idx % 2 === 0)
.join("");
return answer.length > 0 ? answer : "EMPTY";
}
- code.replaceAll("1", ""):
'1'을 모두 제거하여 모드 전환 같은 복잡한 조건을 없앱니다. - .split(""):
제거된 문자열을 문자 배열로 만듭니다. - .filter((val, idx) => idx % 2 === 0):
배열의 짝수 인덱스 요소만 골라냅니다. (즉, 0, 2, 4, ... 번째 요소) - .join(""):
배열을 다시 문자열로 합칩니다. - 삼항 연산자:
결과 문자열의 길이를 체크하여, 길이가 0이면 "EMPTY"를 반환합니다.
마무리
만약 기존에 풀었던 문제에 테스트 조건이 추가된다면 임의로 문제 안에있는 조건을 제거했을 경우, 테스트 통과가 되지않는 경우가 생길 수 있습니다. 만약 입력값 중에 `adc1sadfdsaf1sadf`형식의 입력값이 들어온다면 mode 조건이 제거된 두번째로 작성된 코드는 통과하지 못합니다. 그렇기 때문에 결과값에 영향을 주지 않는 조건을 제거할 때에는 문제에 대해 제대로 이해하고 구별해 내는 것이 필요합니다.
'Algorithm.' 카테고리의 다른 글
자바스크립트 배열 누적값 더하기 (0) | 2025.03.03 |
---|---|
그래프 (4) | 2024.08.25 |
[코테 합격자되기 Js] 문제 16 기능 개발 (0) | 2024.08.14 |
[코테 합격자되기 Js] 문제 17 카드뭉치 (0) | 2024.08.14 |
알고리즘 개념 , 큐 (0) | 2024.08.13 |