https://school.programmers.co.kr/learn/courses/30/lessons/131128
문제 설명
두 정수 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의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.
"100" | "2345" | "-1" |
"100" | "203045" | "0" |
"100" | "123450" | "10" |
"12321" | "42531" | "321" |
"5525" | "1255" | "552" |
function solution(X, Y) {
var answer = '';
function makeObject(text){
let object = {}
for(let i of text){
object[i] ? object[i] ++ : object[i] = 1
}
return object
}
const objectX = makeObject(X)
const objectY = makeObject(Y)
for (let keyX in objectX){
for (let keyY in objectY){
if (keyX.includes(keyY)){
answer += keyX.repeat(Math.min(objectX[keyX],objectY[keyY]))
}
}
}
answer = answer.split('').sort(function (a, b) {
return b-a}).join('')
if (answer ===''){
return '-1'
}else if (Number(answer)===0){
return '0'
}
return answer
}
숫자 객체만들기
function makeObject(text){
let object = {}
for(let i of text){
object[i] ? object[i] ++ : object[i] = 1
}
return object
}
const objectX = makeObject(X)
const objectY = makeObject(Y)
저는 숫자X,Y를 객체로 만들어서 그 숫자에 각각 어떠한 숫자가 몇개씩 들어있는지 생성하였습니다.
예를들어 X = 12321이라는 수를 객체로 만들면
{
1 : 2,
2 : 2,
3 : 1
}
1이 2개 2가 2개 3이 한개인 숫자입니다.
Y도 생성해 볼까요? Y = 425311이면 객체가 어떻게 생성될까요?
{
1 : 2,
2 : 1,
3 : 1,
4 : 1,
5 : 1
}
객체 비교 후 answer 에 저장
for (let keyX in objectX){
for (let keyY in objectY){
if (keyX.includes(keyY)){
answer += keyX.repeat(Math.min(objectX[keyX],objectY[keyY]))
}
}
}
그 다음 만들어 놓은 객체 두개의 key값을 비교하는 for 문을 제작했습니다. 신기하게도 for in 구문을 사용하면 객체의 key값을 바로 사용할 수 있더라고요.
그래서 X의 키값과 Y의 키값을 비교한 값 중 중복되는 것이 있으면 그 값의 value 값 중 작은 값을 repeat함수의 인자로 넣어서 중복되는 key값을 string으로 보낸 후 answer에 더해줍니다.
위의 예시를 보면 aswer에 어떤 값이 저장될까요?
1이 2개 중복 2가 1개 중복 3이 1개 중복이니까
answer = '1123'이 되고
내림차순 정리
answer = answer.split('').sort(function (a, b) {
return b-a}).join('')
그 값을 내림차순 정리하면 정답이 됩니다.
나머지 조건
if (answer ===''){
return '-1'
}else if (Number(answer)===0){
return '0'
}
그 아래 문장들은 중복되는 값이 없으면 -1 return
0만 중복 되면 0 return하는 조건문입니다.
이렇게 코딩테스트를 했는데.... 다른 사람들의 정답을 보니 조금 더 깔끔하긴하군요. 뭔가 저의 코드는 raw 한 느낌? 이랄까요
다른 사람의 코드로 복습하면서 오늘의 글을 종료하겠습니다.
다른분의 코드
function solution(X, Y) {
const commonNums = [];
const objX = {};
const objY = {};
for(const el of X) {
objX[el] = (objX[el] || 0) + 1
}
for (const el of Y) {
if (objX[el]) {
commonNums.push(el);
objX[el]--;
}
}
commonNums.sort((a, b) => b - a);
if (commonNums.length === 0) return "-1";
if (commonNums[0] === "0") return "0";
return commonNums.reduce((acc, cur) => acc + cur, "");
}
'코딩 개발' 카테고리의 다른 글
OAuth 2.0 (0) | 2023.01.19 |
---|---|
코딩테스트 - 햄버거 만들기(알고리즘 이해) (2) | 2023.01.18 |
HTTP (0) | 2023.01.08 |
기업협업 Project (0) | 2023.01.05 |
Node.js - Crawling(크롤링) (0) | 2022.12.14 |