본문 바로가기

코딩테스트

Level1_가장 큰 수

문제 설명

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력 예

입출력 예 설명

  • [1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다.
  • [2, 3, 5, 6]의 세 번째 숫자는 5입니다.[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
  • [1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.

 


 

풀이

💡 숫자를 정렬 → 크기순이 아닌 유니코드의 역순으로 정렬을 해야 한다. [6, 10, 2] -> [6, 2, 10]

💡 Number to String  → 숫자 연산이 아닌 문자열의 병합이 되야한다.  

 

 

1️⃣ 배열의 원소를 map메소드를 이용해 String으로 바꿔준다. 

* 두번째 입출력 예를 대입해 보았다. 

numbers = [3, 30, 34, 5, 9];

function solution(numbers) {
    var answer = numbers.map(n => n.toString());
    return answer;
}

solution(numbers); // [ '3', '30', '34', '5', '9' ]

 

2️⃣ 두 문자열을 더한 값을 비교하여 역순으로 정렬해 준다.

numbers = [3, 30, 34, 5, 9];

function solution(numbers) {
    var answer = numbers.map(n => n.toString()).sort((a,b) => (b+a) - (a+b));
    return answer;
}

solution(numbers); // [ '9', '5', '34', '3', '30' ]

 

3️⃣ 문자열을 join 메서드로 합쳐준다.

function solution(numbers) {
    var answer = numbers.map(n => n.toString()).sort((a,b) => (b+a) - (a+b)).join('');
    return answer;
}

solution(numbers); // '9534330'

 

4️⃣ 모든 원소가 0일 경우에는 '0'을 리턴해준다.  (테스트에서 실패 떴던 부분)

  • 모든 원소가 0이 아니라면 배열의 첫번째 원소가 0일 경우는 존재하지 않는다.
  • 모든 원소가 0이라면 배열의 첫번째 원소는 0일 수 밖에 없다.
  • 삼항 연산자로 분기처리를 해준다. 첫번째 원소가 0이면 문자열 0을 반환하고 아니면 answer 그대로 반환한다.
function solution(numbers) {
    var answer = numbers.map(n => n.toString()).sort((a,b) => (b+a) - (a+b)).join('');
    return answer[0] === '0' ? '0' : answer;
}

solution(numbers); // '9534330'

 

✔️ 놓쳤던 부분 

  • sort에 비교 함수를 넣지 않고 역정렬을 시켰을 때 330이 아닌 303으로 정렬되기 때문에 주어진 조건을 만족시키지 못한다. 
numbers = [3, 30, 34, 5, 9];

numbers.map(n => n.toString()).sort().reverse().join('');

solution(numbers); // '9534303'

 

 

🧶 복습_sort메소드의 compareFunction [ 참고: MDN sort() ]

 

  • compareFunction이 없을 경우 요소를 문자열로 변환하고, 유니 코드 순서대로 문자열을 비교하여 정렬된다.
  • compareFunction이 있을 경우 배열 요소는 compare 함수의 반환 값에 따라 정렬된다. 
    • compareFunction(a, b) < 0  ➡️  [a, b]
    • compareFunction(a, b) = 0  ➡️  a, b 변경 X
    • compareFunction(a, b) > 0  ➡️  [b, a]
  • compareFunction(a, b)은 요소 a와 b의 특정 쌍이 두 개의 인수로 주어질 때 항상 동일한 값을 반환해야 한다. 일치하지 않는 결과가 반환되면 정렬 순서는 정의되지 않는다. 

 

 

출처 : 프로그래머스

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

'코딩테스트' 카테고리의 다른 글

Level1_비밀지도  (0) 2020.09.03
Level1_K번째 수  (0) 2020.06.16
Level1_가운데 글자 가져오기  (0) 2020.06.11
Level1_완주하지 못한 선수  (0) 2020.06.09
Level1_약수의 합  (0) 2020.06.09