-
[CodeKata] 프로그래머스(Lv3) : 110 옮기기Algorithm 2022. 5. 2. 04:09반응형
🥋 Oooth More!! (Level 3)
🧮 풀이
110을 찾은 뒤, 이보다 큰 111이 있는 경우 이를 대치하면 된다고 생각했다.
또한, 대치된 110의 인덱스를 저장해서 다음 110을 찾을 때 해당 위치를 제외하려고 했으나, 복잡한 로직으로 시간초과가 발생하게 되었다.
🖇 리뷰
stack을 이용해 110들을 저장하고, 남은 값들 중 가장 끝에 있는 0 뒤로 이를 붙이면 되는 생각보다 쉬운 문제였다.
const answer = []; function solution(s) { for (let t = 0; t < s.length; t++) { let str = s[t] let stack = []; let tmp = find110(str, stack); if (tmp == '') answer.push(str); else { const tmpStr = stack.join(''); const idx = tmpStr.lastIndexOf('0') + 1; answer.push(tmpStr.substring(0, idx) + tmp + tmpStr.substring(idx)); } } return answer; } function find110(str, stack) { let tmp = ''; for (let i = 0; i < str.length; i++) { const c = str.charAt(i); if (stack.length >= 2) { const b = stack.pop(); const a = stack.pop(); if (a == '1' && b == '1' && c == '0') { tmp += '110'; continue; } stack.push(a); stack.push(b); } stack.push(c); } return tmp; }
* 출처 : https://intrepidgeeks.com/tutorial/mobile-10javascript-programmers-110
1. find110() 함수
- 인자는 str(현재 문자열), stack(스택배열) 2개를 받는다.
- tmp는 찾은 110들을 저장하는 문자열이다.
- str를 순회하며 c(현재문자)와 stack의 가장 최근 2개 문자(a,b)를 확인한다. 이 셋이 110이면 tmp에 110을 더하고 다음 단계로 바로 넘어간다.
- 110이 아니라면 다음 순회로 정상적으로 넘어가야 한다. stack에 빼온 반대의 순서로, a, b, c를 차례로 넣어준다.
- 최종적으로, 우리가 찾은 110들을 가진 문자열 tmp를 반환한다.
2. solution() 풀이
- s 문자열 배열을 순회한다. str은 현재 문자열, stack은 스택배열이다.
- tmp는 find110() 함수의 반환값이다. 또한, stack 배열을 인자로 넘겨 참조했기 때문에, 여기엔 str에서 110들을 제외한 나머지 문자들이 들어가있다.
- tmp가 빈 문자열이라면 110이 없는 경우로, 이 땐 str 자체를 answer에 넣어주면 된다.
- 아니라면, 우선 stack의 문자들을 join() 한다. 그리고, 여기서 마지막 0의 위치를 lastIndexOf()로 찾고, 바로 다음 인덱스인 idx를 선언한다. (여기가, tmp가 들어갈 위치)
- str에서 idx에 tmp가 들어간 문자열을 최종적으로 answer에 넣어준다.
반응형'Algorithm' 카테고리의 다른 글
[CodeKata] 프로그래머스(Lv3) : 사라지는 발판 (0) 2022.04.24 [CodeKata] 프로그래머스(Lv3) : 공 이동 시뮬레이션 (0) 2022.04.17 [CodeKata] 프로그래머스(Lv3) : 파괴되지 않은 건물 (0) 2022.04.10 [CodeKata] 프로그래머스(Lv3) : 양과 늑대(KAKAO) (0) 2022.04.02 [CodeKata] 프로그래머스(Lv3) : N-Queen (0) 2022.03.26