-
[프로그래머스 / JS] Lv.1 숫자 짝꿍Algorithm/프로그래머스 2022. 12. 22. 18:23반응형
문제 설명
두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.
예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)
두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 solution 함수를 완성해주세요.
제한사항
- 3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.
- X, Y는 0으로 시작하지 않습니다.
- X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.
풀이
function solution(X, Y) { let g = [X, Y].sort((a, b) => a.length - b.length); let nested = '' g = g.map(ele => { let objCount = ele.split('').reduce((acc, cur) => { acc[cur] = (acc[cur] || 0) + 1 return acc }, {}) return objCount }) for (let key of Object.keys(g[0])) { if (g[1][key]) { let count = Math.min(g[0][key],g[1][key]) nested += key.repeat(count) } } nested = nested.split('').sort((a, b) => b - a).join('') if (nested[0] === undefined) return "-1" else if (nested[0] === '0') return "0" else return nested }
실행에 걸린 최대 시간 : 526.95ms
사고과정
- 일단 둘 중 짧은 걸 찾자. 배열로 감싸고 sort를 쓰면 되겠다
- 작은 걸로 반복문을 돌리면서 조건문을 이용해 중복되는 값이 있으면 nested에 넣고 비교군(긴 것)에서 지우자
- 시간초과 뜨네???
- 객체를 이용해서 시간을 단축시켜야 겠다.
- split을 통해 문자열을 배열로 바꾸고 reduce를 통해 객체를 생성하자
- 짧은거 긴거 다 변환완료 됐으면 짧은 것의 키 값으로 반복문을 돌리고 반약 긴것에도 동일한 키가 존재한다면 키에 대응하는 value 값 중 작은것 만큼 연속된 문자를 nested에 추가하자
- nested를 한번 정리해야겠네... 1번에서처럼 정리해야지
- 조건에 따라 반환만 하면 되겠구만
- 성공!!
평가
다른 사람들의 풀이에서 걸리는 시간보다 반 정도밖에 안걸린다. 나름 괜찮게 푼듯ㅋ
개선점
알게된점
반응형'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / JS] Lv.1 성격 유형 검사하기 (0) 2022.12.23 [프로그래머스 / JS] Lv.1 크기가 작은 부분문자열 (0) 2022.12.22 [프로그래머스 / JS] Lv.1 삼총사 (0) 2022.12.22 [프로그래머스 / JS] Lv.1 콜라 문제 (0) 2022.12.22 [프로그래머스 / JS] Lv.1 옹알이(2) (1) 2022.12.22