-
[프로그래머스/JavaScript] 튜플 (Feat. replace?, Set?)IT Study/프로그래머스 2023. 12. 3. 18:57728x90
위 문제 풀이 시작합니다.
👿 1. 문제 접근
"일단 저 요상한 데이터 형식을 배열 안의 배열 형식으로 바꿔야겠다!" 고 생각했습니다.
(1) 맨 앞, 맨 뒤에 중괄호 2개를 빼자.
{{2},{2,1},{2,1,3},{2,1,3,4}} → 2},{2,1},{2,1,3},{2,1,3,4
(2) 모든 { 를 빼자.
2},{2,1},{2,1,3},{2,1,3,4 → 2},2,1},2,1,3},2,1,3,4
(3) `},`가 마치 / (슬래시)와 같이 문자들을 구분해주니, 이 구분자를 기준으로 문자열을 분할하여 배열에 담자.
2},2,1},2,1,3},2,1,3,4 → [ '2', '2,1', '2,1,3', '2,1,3,4' ]
(4) 분할된 문자열의 배열을 배열 안의 배열로 변환하자.
[ '2', '2,1', '2,1,3', '2,1,3,4' ] → [ [ '2' ], [ '2', '1' ], [ '2', '1', '3' ], [ '2', '1', '3', '4' ] ]function solution(s) { var answer = []; // 1. {{ }} 맨 앞/뒤 중괄호 2개 빼기 const sLength = s.length; const s1 = s.slice(2, sLength - 2); // 2. '{' 빼기 const s2 = s1.replaceAll("{", ""); // 3. ,(콤마) 기준 자르고 배열에 담기 const arr = s2.split("},"); // 4. 배열 안의 배열로 만들기 let arrInArr = []; for (let i = 0; i < arr.length; i++) { const item = arr[i]; arrInArr.push(item.split(",")); } return answer; }
👍🏻 2. 문제 해결 (결과 코드)
"각 배열의 길이를 기준으로 정렬하고,
정렬된 배열을 순회하며 중복되지 않는 요소를 추출하여 숫자로 변환하고, 이를 answer 배열에 추가하자."
function solution(s) { var answer = []; // 1. {{ }} 맨 앞/뒤 중괄호 2개 빼기 const sLength = s.length; const s1 = s.slice(2, sLength - 2); // 2. '{' 빼기 const s2 = s1.replaceAll("{", ""); // 3. ,(콤마) 기준 자르고 배열에 담기 const arr = s2.split("},"); // 4. 배열 안의 배열로 만들기 let arrInArr = []; for (let i = 0; i < arr.length; i++) { const item = arr[i]; arrInArr.push(item.split(",")); } // 5. 각 요소 길이 순으로 나열하기 const sortArr = arrInArr.sort((x, y) => x.length - y.length) // 6. 배열 돌며 answer에 push() let beforeArr = []; for (let i = 0; i < sortArr.length; i++) { const item = sortArr[i]; const pushItem = item.filter(x => !beforeArr.includes(x)).join(); answer.push(+pushItem); beforeArr = item; } return answer; }
🧪 3. 테스트 결과
생각보다 시간과 메모리가 많이 사용되었는데요. 다른 이들의 코드를 살펴보겠습니다.
🤷🏻♀️ 4. 다른 이들의 코드
(1) 데이터 형식을 배열 안의 배열 형식으로 한번에 바꾸기
아래는 제 코드입니다.
function solution(s) { var answer = []; // 1. {{ }} 맨 앞/뒤 중괄호 2개 빼기 const sLength = s.length; const s1 = s.slice(2, sLength - 2); // 2. '{' 빼기 const s2 = s1.replaceAll("{", ""); // 3. ,(콤마) 기준 자르고 배열에 담기 const arr = s2.split("},"); // 4. 배열 안의 배열로 만들기 let arrInArr = []; for (let i = 0; i < arr.length; i++) { const item = arr[i]; arrInArr.push(item.split(",")); } return answer; }
아래 코드 보시죠. 제 코드를 단 2줄로 줄였습니다.
{} 중괄호를 [] 대괄호로 대체하고, JSON.parse() 메서드를 사용하여 문자열을 배열로 변환하다니...
function solution(s) { var answer = []; const newS = s.replace(/{/g, '[').replace(/}/g, ']'); const arrInArr = JSON.parse(newS); return answer; }
테스트케이스 7-14까지 소요된 시간을 비교하면, 시간은 1/2.. 아니 1/3 수준입니다.
(2) Set 활용하기
다른 분들의 코드를 보다보니, Set을 사용한 분들이 있더군요.
아래는 역시 제 코드입니다.
function solution(s) { var answer = []; const newS = s.replace(/{/g, '[').replace(/}/g, ']'); const arrInArr = JSON.parse(newS); let beforeArr = []; for (let i = 0; i < sortArr.length; i++) { const item = sortArr[i]; const pushItem = item.filter(x => !beforeArr.includes(x)); answer.push(+pushItem); beforeArr = item; } return answer; }
중복이 불가능하다는 Set의 특징을 사용한 코드이네요.
function solution(s) { var answer = []; const newS = s.replace(/{/g, '[').replace(/}/g, ']'); const arrInArr = JSON.parse(newS); const sortArr = arrInArr.sort((x, y) => x.length - y.length); const set = new Set(); for (let i = 0; i < sortArr.length; i++) { const item = sortArr[i]; item.map((it, idx) => set.add(it)) } answer.push(...set); return answer; }
속도 면에서도 엄청나게 빠른 모습을 보입니다.
그러나 Set은 요소의 순서가 보장되지 않는 자료 구조이기 때문에,
순서가 중요한 문제인 만큼 Set을 사용하기보다는 배열을 사용하는 것이 더 적합한 것으로 보이네요!
(잘못된 지식이라면 바른 길로 지도 부탁들입니다 🙏🏻)
👋🏻 마무리
이렇게 오늘도 프로그래머스 문제를 풀어봤는데요. 아직까지는 매우 재밌는 듯 합니다...
여러분 이번 글 봐주셔서 감사합니다. 다음 글에서 또 봬요⭐️
'IT Study > 프로그래머스' 카테고리의 다른 글
[프로그래머스/JavaScript] 네트워크 (Feat. DFS, 조금씩 이해된다...) (0) 2023.12.13 [프로그래머스/JavaScript] 타겟 넘버 (Feat. DFS.. 재귀함수.. 너 뭔데) (2) 2023.12.01 [프로그래머스/JavaScript] 타겟 넘버 (Feat. forEach 함수) (0) 2023.11.07 [프로그래머스/JavaScript] 베스트앨범 (Feat. 첫 Lv3) (0) 2023.11.06 [프로그래머스/JavaScript] 나머지가 1이 되는 수 찾기 (2) 2023.11.02