ETC/📋 Coding Tests

[프로그래머스/JS] 가장 큰 수 :: 배열

숭코기 2024. 1. 2. 15:47
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

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

programmers.co.kr

 

❓문제

문제 설명

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

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

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

 

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

 

입출력 예
numbers return
[6, 10, 2] "6210"
[3, 30, 34, 5, 9] "9534330"

 


📝 문제 풀이

배열을 하나씩 비교해줘야 하나.. 큰 숫자로 정렬해서 비교를 해줘야 하나 등 고민하다가 결국 다른 사람들 문제 풀이를 참고 했다 🥲

이 문제 풀이의 핵심은 sort() 메서드

 

array.sort((a, b) => a - b);

정렬할 할 때 자주 사용했던 위의 코드. 하지만 추상적으로만 이해하고 작동하는 원리를 제대로 찾아보지 않은 나.

반성의 의미로 지금부터 알아보자 😇

 

위의 코드에서 a - b를 해주는 이유는 값을 뺐을 때

양수가 나오면 배열의 자리를 교체, 음수가 나오면 교체하지 않는다

따라서 해당 방식으로 작성하게 되면 무조건 오름차순으로 정렬할 수 있다

 

array.sort((a, b) => b - a);

이건 내림차순 정렬

 

 

sort((a, b) => (b + a) = (a + b));

따라서 이번 문제는 위의 코드를 활용하면 풀어낼 수 있다

 

 


function solution(numbers) {
	const answer = numbers
    	.map(number => String(number))
        .sort((a, b) => (b + a) - (a + b))
        .join('');
        
	return answer[0] === '0' ? '0' : answer;
}

 

 

💡 해설

 

numbers.map(number => String(number))

각 숫자들을 문자로 변환

(12 -> '12')

 

sort((a, b) => (b + a) - (a + b))

문자로 변환된 숫자들을 연결하여 비교 정렬

('3', '30' -> (('303') - ('330'))

 

join('')

문자열 합치기

 

answer[0] === '0' ? '0' : answer

numbers의 배열이 0으로만 구성되어 있을 경우 '0' 출력

728x90