[Algorithm] 프로그래머스 42746 : 가장 큰 수

Ell!·2021년 10월 31일
0

algorithm

목록 보기
5/5

내 풀이

저번에 이어 이번에도 가장 큰 수를 구하는 문제... 이틀이나 노력해보았지만 쉽지 않았다.

우선 이런 시도를 먼저 했다.

// 두 수를 비교
function compare(A, B){
  let lenA = String(A).length;
  let lenB = String(B).length;
  // 1. 같은 자릿수
  if(lenA === lenB){
    if(A > B){
      return A;
    } else {
      return B;
    }
  } 
  // 2. 다른 자릿수
  else if(lenA !== lenB){
    let diff = Math.abs(lenA - lenB);
    let plusZero = '0'.repeat(diff);
    // 2-1. 같은 앞자리여서 0만 붙이면 같은 숫자가 되는 경우 : 더 짧은 수가 이김
    if(String(A) + plusZero === String(B)){
      return A;
    } else if(String(A) === String(B) + plusZero){
      return B;
    }
    // 2-2. 같은 앞자리가 아니어서 짧은 수에 0붙이면 같은 자리 되는 경우 : 더 큰 수가 이김
    if(lenA < lenB){
      if(Number(String(A) + plusZero) > B){
        return A;
      } else if(Number(String(A) + plusZero) < B){
        return B;
      } 
    } else {
      if(A < Number(String(B) + plusZero)){
        return B;
      } else if(A > Number(String(B) + plusZero)){
        return A;
      }
    }
  }
}


function solution(numbers){
  let answer = '';



  while(numbers.length > 0){
    let max = numbers[0];
    for(let i = 0; i < numbers.length; i++){
      let number = numbers[i];
      max = compare(max,number);
    }
    answer += String(max);
    numbers.splice(numbers.indexOf(max),1);
  }
  

  return answer;
}

핵심 아이디어는 loop문을 돌아가며 계속 비교해가며 가장 적합한 수를 찾아서 더해주며 큰 수를 찾아내는 것...

결과는 처참했다;;

아무래도 내가 아예 잘못 생각하고 있는 것은 아닌지...

질문하기 확인

내가 너무 과하게 생각하고 있었다...

// 두 수를 비교
function compare(A, B){
  let strA = String(A);
  let strB = String(B);

  if(strA + strB > strB + strA){
    return A;
  } else {
    return B;
  }
}

이렇게만 해줘도 되는 것을..!!! 그래도 시간초과가 나온다. 아랫부분을 손봐야겠다. O(n^2)가 나오는거 같은데 다른 방법이 없나..?

정답

function solution(numbers){
  let answer = '';

  numbers.sort((A,B)=>{
    let strA = String(A);
    let strB = String(B);
    // 내림차순 정리. 요건 항상 헷갈리더라. 그냥 해보자.
    if(strA + strB > strB + strA){
      return -1; 
    } else {
      return 1; 
    }
  })

  answer = numbers.join('');
 
  if(Number(answer) === 0){
    return '0'
  }
  return answer;
}

이런 젠장..! 이렇게 쉬운거를 이상하게 너무 어렵게 생각하고 있었다니..!
그냥 string으로 변환해서 두 수 중에 더 큰거 나오는거 반환시키는 sort함수 하면 되는거였자나!! 😢

profile
더 나은 서비스를 고민하는 프론트엔드 개발자.

0개의 댓글