[백준] 숫자놀이 - 1755번

2024. 5. 30. 20:58·여러가지/알고리즘 & 자료구조

[Silver IV] 숫자놀이 - 1755

문제 링크

성능 요약

메모리: 18708 KB, 시간: 244 ms

분류

정렬, 문자열

제출 일자

2024년 5월 30일 20:49:15

문제 설명

79를 영어로 읽되 숫자 단위로 하나씩 읽는다면 "seven nine"이 된다. 80은 마찬가지로 "eight zero"라고 읽는다. 79는 80보다 작지만, 영어로 숫자 하나씩 읽는다면 "eight zero"가 "seven nine"보다 사전순으로 먼저 온다.

문제는 정수 M, N(1 ≤ M ≤ N ≤ 99)이 주어지면 M 이상 N 이하의 정수를 숫자 하나씩 읽었을 때를 기준으로 사전순으로 정렬하여 출력하는 것이다.

입력

첫째 줄에 M과 N이 주어진다.

출력

M 이상 N 이하의 정수를 문제 조건에 맞게 정렬하여 한 줄에 10개씩 출력한다.

코드

package 숫자놀이;

import java.util.*;
import java.util.stream.Collector;

public class Main {
    public static void main(String[] args) {
        Map<Integer, String> numMap = new HashMap<Integer, String>();
        numMap.put(1, "one");
        numMap.put(2, "two");
        numMap.put(3, "three");
        numMap.put(4, "four");
        numMap.put(5, "five");
        numMap.put(6, "six");
        numMap.put(7, "seven");
        numMap.put(8, "eight");
        numMap.put(9, "nine");
        numMap.put(0, "zero");

        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        int M = scanner.nextInt();

        //TreeSet<String> digitSet = new TreeSet<>(); // 이름을 역순으로 정렬하는 TreeSet
        Map<Integer, String> digitMap = new LinkedHashMap<>();

        for(int i = N; i<=M; i++){
            String digit = "";
            if(i >= 10){
                String[] strList = String.valueOf(i).split("");

                int front = Integer.parseInt(strList[0]);
                int back = Integer.parseInt(strList[1]);
                digit = numMap.get(front) + " " + numMap.get(back);
            }else{
                digit = numMap.get(i);
            }
            digitMap.put(i, digit);
        }
        // 엔트리 리스트를 값 기준으로 정렬하기
        List<Map.Entry<Integer, String>> sortedEntries = new ArrayList<>(digitMap.entrySet());
        Collections.sort(sortedEntries, new Comparator<Map.Entry<Integer, String>>() {
            @Override
            public int compare(Map.Entry<Integer, String> entry1, Map.Entry<Integer, String> entry2) {
                return entry1.getValue().compareTo(entry2.getValue());
            }
        });

        StringBuilder outputBuffer = new StringBuilder(); // 결과를 저장할 StringBuilder 생성

        int count = 0; // 숫자가 출력된 횟수를 나타내는 변수를 0으로 초기화합니다.

        for (Map.Entry<Integer, String> entry : sortedEntries) {
            if (count == 10) { // 10개의 숫자가 출력된 후에는 줄 바꿈을 합니다.
                outputBuffer.append("\n");
                count = 0; // 숫자가 출력된 횟수를 초기화합니다.
            }
            if (count > 0) { // 첫 번째 숫자가 아닌 경우에는 공백을 출력합니다.
                outputBuffer.append(" ");
            }
            outputBuffer.append(entry.getKey()); // 숫자를 StringBuilder에 추가합니다.
            count++; // 숫자가 출력된 횟수를 증가시킵니다.
        }

        // StringBuilder에 저장된 결과를 한 번에 출력합니다.
        System.out.print(outputBuffer.toString());

    }
}

몰랐던 것

  1. Map 자료구조를 Value를 기준으로 정렬하기 위해서는 ArrayList자료구조에 담아 처리해야한다.
  2. 이에 도움을 주는 자바API는 Collections.sort메소드를 이용하여 매개변수에 표현식을 삽입하여 처리 할 수 있다.
Collections.sort(sortedEntries, new Comparator<Map.Entry<Integer, String>>() {
            @Override
            public int compare(Map.Entry<Integer, String> entry1, Map.Entry<Integer, String> entry2) {
                return entry1.getValue().compareTo(entry2.getValue());
            }
        });

함수 호출 시 2번째 매개변수에 표현식을 삽입하는 것을 "익명 클래스"를 사용한다고 할 수 있습니다.

익명 클래스는 이름이 없는 클래스로, 클래스를 정의하면서 동시에 인스턴스를 생성할 수 있습니다. 주로 인터페이스나 추상 클래스를 구현하거나 상속하는 용도로 사용됩니다.

위의 코드에서는 Comparator 인터페이스를 구현하는 익명 클래스를 정의하여 Collections.sort 메서드에 전달했습니다. 이 익명 클래스는 compare 메서드를 오버라이딩하여 두 개의 Map.Entry<Integer, String> 객체를 비교하고 있습니다.

  • 만약, 내림차순 정렬을 원한다면 return 문의 entry1, entry2의 위치를 바꾸어주어야 합니다.
    | entry2.getValue().compareTo(entry1.getValue());
저작자표시 (새창열림)

'여러가지 > 알고리즘 & 자료구조' 카테고리의 다른 글

시간복잡도  (0) 2024.05.31
[백준]알고리즘의 수행 시간 2 - 24263번  (0) 2024.05.31
[백준] 파일 정리 - 20291번  (1) 2024.05.30
[백준] 회사에 있는 사람 - 7785번  (0) 2024.05.30
[백준] 평균 - 1546번  (0) 2024.05.30
'여러가지/알고리즘 & 자료구조' 카테고리의 다른 글
  • 시간복잡도
  • [백준]알고리즘의 수행 시간 2 - 24263번
  • [백준] 파일 정리 - 20291번
  • [백준] 회사에 있는 사람 - 7785번
hyeseong-dev
hyeseong-dev
안녕하세요. 백엔드 개발자 이혜성입니다.
  • hyeseong-dev
    어제 오늘 그리고 내일
    hyeseong-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (283)
      • 여러가지 (108)
        • 알고리즘 & 자료구조 (73)
        • 오류 (4)
        • 이것저것 (29)
        • 일기 (1)
      • 프레임워크 (39)
        • 자바 스프링 (39)
        • React Native (0)
      • 프로그래밍 언어 (39)
        • 파이썬 (31)
        • 자바 (3)
        • 스프링부트 (5)
      • 컴퓨터 구조와 운영체제 (3)
      • DB (17)
        • SQL (0)
        • Redis (17)
      • 클라우드 컴퓨팅 (2)
        • 도커 (2)
        • AWS (0)
      • 스케쥴 (65)
        • 세미나 (0)
        • 수료 (0)
        • 스터디 (24)
        • 시험 (41)
      • 트러블슈팅 (1)
      • 자격증 (0)
        • 정보처리기사 (0)
      • 재태크 (0)
        • 암호화폐 (0)
        • 기타 (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    백준
    파이썬
    ecs
    Python
    reactor
    프로그래머스
    SAA
    항해99
    취업리부트
    DP
    #개발자포트폴리오 #개발자이력서 #개발자취업 #개발자취준 #코딩테스트 #항해99 #취리코 #취업리부트코스
    자바
    AWS
    완전탐색
    Spring Boot
    Spring WebFlux
    Docker-compose
    EC2
    시험
    WebFlux
    java
    OOP
    docker
    Redis
    celery
    FastAPI
    그리디
    RDS
    mybatis
    spring
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
[백준] 숫자놀이 - 1755번
상단으로

티스토리툴바