가장 큰 수

2022. 6. 25. 20:18·코딩테스트/프로그래머스
반응형

아래는 문제 링크입니다.

https://programmers.co.kr/learn/courses/30/lessons/42746?language=java 

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

이번 문제를 풀면서 또다시 느꼈다. 문제를 난잡하게 풀고 있으면, 웬만하면 잘못된 풀이란 것을..

 

문자열로 받아서 Comparable을 구현하는 클래스를 만들어 정렬을 하려고 했다.

웬걸 이런 방식으로 하니 자릿수마다 멤버 변수를 만들고, 이 자리에 대한 정보 값도 넣고 너무 복잡해졌다. 

역시 복잡한 풀이 방식은 다시 생각할 필요가 있는 것 같다.

 

결국 힌트를 얻으려고 해당 문제 게시판을 보았고, Comparator을 사용하라는 힌트를 보았다.

 

맨날 Comparable만 사용했지, Comparator을 사용한 적은 드물다. 

그래서 이번에는 Comparator을 사용해보기로 했다.

  • 둘 다 자바에서 정렬을 할 때 중요한 인터페이스다.
  • Comparable은 자기 자신과 매개변수로 들어오는 객체를 비교한다.
  • Comparaotr은 매개 변수로 들어오는 두 객체를 비교한다.
  • 두 방식다 리턴 값이 양수면 자리를 교환하고, 0이나 음수면 자리를 교환하지 않는다.

그리고 다음과 같은 정렬 방법을 확인했다. 바로 Collections의 sort 메서드다.

Comparator (함수형 인터페이스)를 매개 변수로 사용한다. 이것을 람다로 사용하면 편하게 문제를 해결 할 수 있을 것 같았다.

Collections.sort의 매개변수가 함수형 인터페이스인 Comparator

이제 익명 클래스를  작성해야 하는데, 함수형 인터페이스는 메서드를 하나만 가지고 있다.

그리고 반드시 이를 오버라이딩해야한다. 오버라이딩한 compare 메서드에서 String 클래스의 compareTo 메서드를 사용했다.

인스턴스와 매개변수의 아스키 값을 비교해 차이를 돌려주기 때문에 리턴 타입이 int형이다.

String 클래스의 compareTo 메서드

동작 방식은 아래 코드에서 확인할 수 있다.

 String str1 = "1";
 String str2 = "9";
 System.out.println(str2.compareTo(str1));
 //8이 출력된다.
        
       
 String str1 = "1";
 String str2 = "9";
 System.out.println(str1.compareTo(str2));
 //-8이 출력된다.

 

아래는 해답 코드다.

import java.util.*;

class Solution {
    
    public String solution(int[] numbers) {
        List<String> arr = new ArrayList<>();
        String answer = "";

        for (int number : numbers) {
            arr.add(String.valueOf(number));
        }

        Collections.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o2 + o1).compareTo(o1 + o2);
            }
        });

        if(arr.get(0).equals("0")) {
            return "0"; //제일 처음이 0이면 0을 리턴.
        }

        for (String s1 : arr) {
                answer += s1;
        }


        return answer;
    }
}

Comparator도 확인하고 String 클래스의 compareTo도 확인할 수 있는 좋은 기회였다.

난이도가 너무 높지 않은데, 문제 풀이가 복잡해지면 다시 생각해보자.

 

이상으로 포스팅을 마칩니다. 감사합니다.

반응형
'코딩테스트/프로그래머스' 카테고리의 다른 글
  • 더 맵게
  • 실패율
  • [1차] 다트 게임
  • 신고 결과 받기
Debin
Debin
공부 기록을 남기며 게시글 리팩토링을 진행하는 블로그입니다.
  • Debin
    리팩토링하는 블로그
    Debin
  • 전체
    오늘
    어제
    • 분류 전체보기
      • DB
        • DB 기초
        • MySQL
        • SQL 튜닝
      • OS
      • Network
      • Git
      • 디지털콘텐츠기획
      • 소프트웨어공학
      • 코딩테스트
        • 프로그래머스
        • 백준
        • 인프런
      • 공부 일지
      • 독서
        • 클린코드
        • 일상 속 사물이 알려주는 웹 API 디자인
        • 토비의 스프링
        • 객체지향의 사실과 오해
        • 자바 잘 읽는 법
      • 기록 및 회고
      • Cloud
        • AWS
      • 개발
        • Java
        • Spring Core
        • Spring MVC
        • Spring DB
        • Spring Boot
        • Spring Security
        • Spring Batch
        • JPA
        • Test
        • Android
      • 대외활동
        • UMC SERVER
        • 카엔프 SW 아카데미
      • 프로젝트
      • Docker
      • Gradle
      • ELK
      • 실무 이야기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

    • 본인 깃허브입니다!
  • 인기 글

  • 태그

    운영체제
    자바
    트랜잭션
    spring
    ORM
    도커
    Java
    innodb
    객체
    인덱스
    test
    코딩 #개발자 #노마드북클럽 #노개북
    AWS
    토비의 스프링
    스프링
    컨테이너
    스프링 부트
    객체지향
    프록시
    docker
    mysql
    리눅스
    spring mvc
    JPA
    SQL
    데이터베이스
    AOP
    spring boot
    container
    redis
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Debin
가장 큰 수
상단으로

티스토리툴바