공부하기/백준

[Java] 백준 풀기 1755 - 숫자놀이

XEV 2023. 12. 6. 23:12

자바 백준 1755번

실버 4

https://www.acmicpc.net/problem/1755

 

1755번: 숫자놀이

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

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 문자열, 정렬

 

 

 

 

 

연습 코드

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;


class NumberAndRead {
    int number;
    String read;
    
    NumberAndRead(int number, String read) {
        this.number = number;
        this.read = read;
    }
}

public class Main {
    public static void main(String[] args) {
        List<NumberAndRead> numbersList = new ArrayList<>();
        numbersList.add(new NumberAndRead(1, "one"));
        numbersList.add(new NumberAndRead(2, "two"));
        numbersList.add(new NumberAndRead(3, "three"));
        numbersList.add(new NumberAndRead(4, "four"));
        numbersList.add(new NumberAndRead(5, "five"));
        
        // 문자열을 기준으로 NumberAndRead 객체를 비교하는 Comparator를 사용하여 리스트 정렬
        Collections.sort(numbersList, Comparator.comparing(o -> o.read));
        
        /*
        Comparator.comparing() 메서드:
        - Comparator.comparing() 메서드는 Comparator 인터페이스를 구현하는데 사용되며,
          비교 기준을 제공하는 정적 메서드.
        - 여기서 o -> o.read는 람다 표현식으로, numbersList에 있는 NumberAndRead 객체들을 받아서
          해당 객체의 read 필드 값을 기준으로 비교.
        - 따라서, Comparator.comparing() 메서드를 사용하여 NumberAndRead 객체를 read 필드 값을 기준으로
          사전순 정렬.
        - 이 정렬은 Collections.sort() 메서드를 통해 numbersList 내의 객체들을 변경.
        */
        
        
        // 정렬된 리스트 출력
        for (NumberAndRead pair : numbersList) {
            System.out.println(pair.number + " - " + pair.read);
        }
    }
}



/*

5 - five
4 - four
1 - one
3 - three
2 - two

*/

 

 

 

 

 

코드 보기

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

// 숫자와 그 숫자를 영어로 읽은 문자열을 저장하는 클래스
class NumberAndRead {
    int number;
    String read;
    
    NumberAndRead(int number, String read) {
        this.number = number;
        this.read = read;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        // 입력 받기
        int M = sc.nextInt(); // 범위의 시작 값
        int N = sc.nextInt(); // 범위의 끝 값
        
        // 숫자와 문자열 저장할 리스트
        List<NumberAndRead> numbersList = new ArrayList<>(); 
        
        // M부터 N까지의 숫자와 해당 숫자를 영어로 읽은 문자열을 리스트에 추가
        for (int i = M; i <= N; i++) {
            numbersList.add(new NumberAndRead(i, getRead(i)));
        }
        
        // 문자열을 기준으로 리스트를 사전순으로 정렬
        Collections.sort(numbersList, Comparator.comparing(o -> o.read));
        
        int count = 0;
        for (NumberAndRead pair : numbersList) {
            // 숫자 출력
            System.out.print(pair.number + " ");
            count++;
            if (count % 10 == 0) {
                // 10개씩 출력 후 줄 바꿈
                System.out.println();
            }
        }
    }
    
    // 숫자를 영어로 변환하여 반환하는 메서드
    private static String getRead(int number) {
        // 입력된 정수를 문자열로 변환하여 numStr 변수에 저장
        String numStr = Integer.toString(number);
        
        // 결과를 저장할 StringBuilder 객체 생성
        StringBuilder result = new StringBuilder();
        
        // 각 자리수를 순회하며 영어 표현으로 변환하여 result에 추가
        for (int i = 0; i < numStr.length(); i++) {
            // 현재 자리수의 숫자를 가져옴
            int digit = Character.getNumericValue(numStr.charAt(i));
            
            // 숫자를 영어로 읽은 문자열을 numbers 배열에서 가져와 result에 추가
            result.append(numbers[digit].read).append(" ");
        }
        
        // 결과 문자열의 양 끝에 있는 공백 제거 후 반환
        return result.toString().trim();
    }
    
    // 숫자와 해당 숫자를 영어로 읽은 문자열을 미리 정의한 배열
    private static final NumberAndRead[] numbers = {
            new NumberAndRead(0, "zero"),
            new NumberAndRead(1, "one"),
            new NumberAndRead(2, "two"),
            new NumberAndRead(3, "three"),
            new NumberAndRead(4, "four"),
            new NumberAndRead(5, "five"),
            new NumberAndRead(6, "six"),
            new NumberAndRead(7, "seven"),
            new NumberAndRead(8, "eight"),
            new NumberAndRead(9, "nine")
    };
}



/*

8 28

8 9 18 15 14 19 11 17 16 13 
12 10 28 25 24 21 27 26 23 22 
20 

*/