본문 바로가기

알고리즘/99클럽 코딩테스트 스터디 2기

99클럽 코테 스터디 7일차 TIL - LV2. 가장 큰 수

728x90
반응형

 

오늘의 학습 키워드

  • 정렬

오늘의 회고

1. 문제

문제 URL

 

프로그래머스

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

programmers.co.kr

2. 해결 방안

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public String solution(int[] numbers) {
        String[] numbersStr = new String[numbers.length];

        for(int i=0; i<numbers.length; i++) {
            numbersStr[i] = String.valueOf(numbers[i]);
        }

        Arrays.sort(numbersStr, (o1, o2) -> (o2+o1).compareTo(o1+o2));

        if(numbersStr[0].equals("0")) return "0";

        return String.join("",numbersStr);
    }
}
  • 숫자 배열을 문자로 변환해서 담는다.
  • Arrays.sort()에 정렬하는 로직을 추가한다. 문자 앞뒤를 붙여서 비교한다.
  • 첫번째 값이 "0"이면 전체 요소가 "0"이기 때문에 문자열로 붙였을 때 "0000" 같은 경우가 되지 않도록 "0" 만 반환한다. (놓칠 수 있는 포인트!)

3. 피드백

<처음 고민했던 방향>

  • 앞+뒤, 뒤+앞 붙여서 비교한건 방향성이 맞았는데, 나는 "앞+뒤" -> 숫자로 변환 해서 숫자로 비교하려고 했다. 그래서 비교 요소 중에 0인 경우가 나올 경우도 비교 조건으로 추가했다.
  • 근데 숫자 비교를 시킬 필요가 없이, 합친 문자끼리 비교하면, 앞이 0일 경우 어차피 뒤로 정렬되니 0처리를 안해도 되었음.
  • 첫번째 값이 "0"인 경우 "0" 반환 처리하는 것도 놓쳤어서 테스트 케이스를 통과 못했던 것 같다.

4. 새로 알게된 것

  • 정렬 리턴으로 a.compareTo(b) 사용하기 (compareTo는 원시타입 아닌 객체형만 사용 가능)
    • a:기준값, b:비교대상
    • a가 b 보다 크면 1, 동일하면 0, 작으면 -1
    • 1(양수)이면 순서 교체 (a, b -> b, a)
  • 배열 정렬 시, 람다식 정렬로 짧게 작성할 수 있다
    • Arrays.sort(배열, (o1, o2) -> o2.compareTo(o1)); // 내림차순
  • String 합치는 방법
    • 1. String.join()
    • 2. StringBuilder
// 1. String.join 사용
String[] arr = {"a","b","c"};
String.join("", arr); // "abc"

// 2. StringBuilder 사용
StringBuilder sb = new StringBuilder();
sb.append("앞문자").append(" 뒷문자");
System.out.println(sb.toString()); // "앞문자 뒷문자"
System.out.println(sb); // "앞문자 뒷문자"

 

728x90
반응형