정렬 > 가장 큰 수
https://school.programmers.co.kr/learn/courses/30/lessons/42746
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
골치아픈 문제임
처음에 모든 경우의 수를 만들어서 탐욕알고리즘으로 풀까라고 생각도 해봤지만
탐욕알고리즘조차 아직 제대로 다뤄보지 않아서 그리고 카테고리 자체가 정렬이니
정렬을 이용해서 풀어보라고 해서 sort 를 써서 단순히 내림차순을 해보았더니
당연히 자리수 때문에 이상하게 정렬 된다
방법을 찾던 중
문자열로 정렬하면 어떨까 하는 생각이 들어서
이런 식으로 문자열로 변경한 다음에 첫번째 자리수를 비교하는 식으로 정렬을 해봤다
첫번째 테스트 케이스는 이걸로 충분히 풀리지만
3, 30, 34 가 있을 때는
34, 3, 30 의 순으로 정렬 돼야한다
여기서부터 골치아픈디
두번째 자리수를 비교 해야 하는데
그러면 34, 30 의 두번째 자리수는 4, 0 이라 34가 앞에 가는게 맞지만
자리수가 1개 짜리 인 3이 30 보다 먼저 와야 하므로 (두번째 자리수를 비교 했을때 첫번째 자리수보다 큰 걸 우선으로 정렬 해야함)
자리수의 차이로 String(b).length 도 써보고
다행히 문제 자체가 0 ~ 1000 이하의 숫자이기 때문에 네자리 까지만 하면 되겠다 하는데
이렇게 푸는게 맞나 생각도 들고
결국에 뭔가 뚜렷한 해결책이 안떠올라서 GPT 를 썼더니
이런식으로 짧고 깔끔하게 알려주는 것
근데 이것도 테스트 케이스 11이 통과 되지 않는데
이유는 아마 [0, 0, 0] 의 반례 때문일 것이다. (질문하기 게시판 찾아봄)
물론 if 문으로 반례에 대해 대응을 한 것 같은데
아직 localeCompare 에 대한 이해도 없고 뭐가 문제인지 잘 파악이 안돼서
질문하기를 좀 찾아봤더니
이렇게 풀이한게 있었는데
반례가 [0, 0, 0] 인 경우에만 동작하는 소스이긴 하지만 (그 외에 다른 숫자랑 0이 섞여있을 때는 자리수 때문에 0을 빼면 안된다)
== 을 활용한 느슨한 비교로 풀이한 게 뭔가 다른 방법이 없나 생각이 들었는데
이런식으로 Number를 활용해도 가능
뭔가 정신승리한 느낌...
Number 로 처리 안되는 엄청 큰 수라면 또 이렇게 풀면 안됐을 듯 하다
자력으로 풀어낼 수 없었던 문제였다 아직은 레벨 1짜리로 좀 더 내공을 쌓아야할 듯