풀이
김영준
function solution(numbers) { let answer = ""; // 각 숫자를 문자열로 변경 (숫자를 +연산자로 붙이기 위해서) const array = numbers.join(" ").split(" ") // a b를 더한 값과 역으로 더한 것을 비교해서 내림차순으로 정렬 후 연결 ex) 6,10 => 106 - 610 answer = array.sort((a, b) => (b + a) - (a + b)).join(""); // numbers 배열이 0으로 채워질 경우 "000000"인 경우가 있으니 이 때는 "0"을 리턴, 0이 아니면 계산한 값을 리턴 return answer > 0 ? String(answer) : "0"; } // 처음에는 문자열로 합쳐서 맨 앞자리만 비교해서 계속 넣어주는 로직으로 짜다가 // 예시로 1, 12를 비교하면 뒤에까지 비교를 해야 돼서 코드가 복잡해지더라고요.. // 그래서 비교하는 로직을 그대로 sort 함수로 풀어보자 해서 구현 한 방법입니다. // 자꾸 테스트 통과가 안돼서 알아보니까 numbers가 0으로 채워진 경우가 있더라고요. // 문제에서도 범위가 나와있었는데 앞으로 문제를 더 집중해서 읽어야겠습니다..ㅠ
이종현
function solution(numbers) { // numbers의 모든 원소가 0일 경우 '0000'이 아니라 '0'을 return // 테스트 케이스 하나에서 자꾸 틀렸다해서 검색(예외 케이스) if (numbers.reduce((a, b) => a + b, 0) === 0) return '0'; return numbers // numbers의 모든 원소를 문자열로 변환해준다. .map(String) // 예를 들어 '6' + '10'(a + b) 와 '10' + '6'(b + a)을 비교하면 610 > 106 // 106 - 610 으로 음수가 되어야 내림차순으로 정렬되기 때문에 (b + a) - (a + b)를 해준다. .sort((a, b) => (b + a) - (a + b)) // 문자열로 return 해야하는 제한사항 때문에 배열을 모두 합쳐 문자열로 바꿔주는 join사용 .join(''); }
박노철
// 혼자 해결을 못하고 해설을 보고 풀었습니다. // [6,10,2] 에서 정렬시 610 과 106을 비교시 610이 커서 // 6이 앞으로 10이 뒤로 가야한다. // 그리고 6과 2, 62 과 26이 중 62 이가 더 큼으로 자리는 바뀌지 않는다. // 10과 2에서는 102 와 210중 210이 더 큼으로 10 과 2의 자리를 바꾸어주면된다. // 그리고 "000"시 "0" 으로 예외처리를 해준다. function solution(numbers) { const answer= numbers.map(v=>v.toString()).sort((a,b)=>{ const ab=a+b; const ba=b+a; return ba-ab }).join(""); if(answer*1===0)return "0"; return answer }
이민희
// 첫번째로 시도했던 방법인데, 통과 못하는 테스트케이스가 꽤 있었습니다. function check10(a, a00) { // a00이 a의 10^n(n은 0이상의 정수)의 배수인지 확인해줍니다. let n = 0; while (a * (10**n) <= a00) { if (a * (10**n) == a00) return true; n++; } return false; } function solution(numbers) { numbers.sort().reverse(); // 아스키코드 기준 내림차순합니다. console.log(numbers); // [ 9, 5, 34, 30, 3 ] // 30, 3의 순서를 바꿔줘야 합니다. numbers.sort((a, a0) => { if (check10(a, a0)) { return a - a0; } }); console.log(numbers); // [ 9, 5, 34, 3, 30 ] return numbers[0] === 0 ? '0' : numbers.join(''); } // 수정한 코드입니다. function solution(numbers) { let answer = numbers .map((number) => number.toString()) .sort((a, b) => (b + a) - (a + b)) .join(''); return answer[0] == "0" ? "0" : answer; }
박건우
function solution(numbers) { let answer = ''; // 일단 모든 수를 문자열로 바꿔줍니다. const list = numbers.map((v) => v + ""); // 두 숫자를 자리를 서로 바꾼 것끼리 비교한뒤 // 더 큰 수를 우선으로 정렬합니다. list.sort((a, b) => { let aFirst = a + b; let bFirst = b + a; return +bFirst - +aFirst; }) let str = list.join(""); // "000000" 은 "0"으로 표기해야합니다. // 정규표현식을 사용하여 체크해줍니다. if(!str.match(/[1-9]/g)) return "0"; return str; } // 예전에도 풀었던 문젠데 다시 푸니 또 막혔네요 function solution(numbers) { let answer = ''; const list = numbers.map((v) => v + ""); list.sort((a, b) => { if(a.length === b.length) return +b - +a; else{ const maxLen = Math.max(a.length, b.length); for(let i = a.length; i<maxLen; i+=1){ a += a[a.length - 1]; } for(let i = b.length; i<maxLen; i+=1){ b += b[b.length - 1]; } } return +b - +a; }) return list.join(""); } // 틀린 코드입니다.. // 두 숫자의 길이가 다르다면 // 짧은쪽에 긴 숫자 길이가 될때까지 마지막 숫자를 계속 이어 붙이는 코드입니다. // 반례를 도저히 못찾겠습니다. // 검색결과 반례 찾았네용 [12, 1213] 의 경우 실패하네여
박주연
/* 시행착오 1. 무식하게 만들 수 있는 경우의 수 다 만들고 정렬? => O(numbers.length!)..절대X 2. 그렇다면 숫자들의 첫째자리만 비교해서 큰 순서대로 비교해보기 -> 만약 첫째짜리 다 같으면 둘째자리,셋째자리 다 비교해서 해야하는데 결국 시간이 오래걸린다 -> 이중 for문 될 가능성이 높음 3. 그렇다면 다 문자열로 만들어서 버블정렬처럼 앞에서부터 2개씩 문자열로 합쳐서 비교하면 되지 않을까? */ function solution(numbers) { //먼저 numbers 다 문자열로 만들기 const arr = numbers.map((v)=>String(v)); let result = arr.sort((a,b)=> (b+a)-(a+b)).join(''); //여기까지만 코드를 썼더니 테스트 케이스 11 실패. 0으로만 이루어진 경우의 테스트인듯하다. 테스트케이스 추가해서 수정 return result[0] === '0' ? '0' : result; }