algorithm/문제풀이

정렬 > 가장 큰 수

yongfront 2024. 4. 3. 17:20
반응형
SMALL

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짜리로 좀 더 내공을 쌓아야할 듯

 

 

 

 

728x90
반응형
LIST