숫자놀이

이윤설·2024년 3월 19일

제출코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;


class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine();
        StringTokenizer tokenizer = new StringTokenizer(line, " ");
        int M = Integer.parseInt(tokenizer.nextToken());
        int N = Integer.parseInt(tokenizer.nextToken());

        List<Integer> numbers = new ArrayList<>();
        for (int i = M; i <= N; i++) {
            numbers.add(i);
        }

        Map<Integer, String> dictionary = new HashMap<>();
        dictionary.put(0, "zero");
        dictionary.put(1, "one");
        dictionary.put(2, "two");
        dictionary.put(3, "three");
        dictionary.put(4, "four");
        dictionary.put(5, "five");
        dictionary.put(6, "six");
        dictionary.put(7, "seven");
        dictionary.put(8, "eight");
        dictionary.put(9, "nine");

        TreeMap<String, Integer> treeMap = new TreeMap<>();

        for (int number : numbers) {
            StringBuilder sb = new StringBuilder();
            String target = String.valueOf(number);

            for (int j = 0; j < target.length(); j++) {
                char c = target.charAt(j);
                int candidate = Character.getNumericValue(c);

                if (dictionary.containsKey(candidate)) {
                    sb.append(dictionary.get(candidate));
                    if (j < target.length() - 1) {
                        sb.append(" ");
                    }
                }
            }
            treeMap.put(sb.toString(), number);
        }

        int count = 0;
        for (int number : treeMap.values()) {
            System.out.print(number);
            count++;

            if (count % 10 == 0) {
                System.out.println();
            } else {
                System.out.print(" ");
            }
        }
    }
}

모범답안

import java.io.*;
import java.util.*;

public class Main_HashMap {
	static int m, n;					// m 이상 n 이하의 정수
	static String[] numberStrArr;		// "zero" ~ "nine" 저장
	static StringBuilder sb = new StringBuilder();

	static List<String> list = new ArrayList<>();
	static Map<String, Integer> map = new HashMap<>();

	static void solution() {
		// 1) 정수를 영어로 읽은 문자열을 List 와 HashMap 에 저장
		for (int i = m; i <= n; i++) {
			 String strNumber = String.valueOf(i);			// "80" 형태 문자열
			 StringBuilder strByDigit = new StringBuilder();
			 // 한 숫자(문자)씩 읽은 결과 문자열 ("eight zero" 형태)

			 for (int j = 0; j < strNumber.length(); j++) {
				 int digit = Character.getNumericValue(strNumber.charAt(j));
				 strByDigit.append(numberStrArr[digit])
						 .append(" ");
			 }

			 list.add(strByDigit.toString());
			 map.put(strByDigit.toString(), i);
		}

		// 2) List 를 사전 순으로 정렬
		Collections.sort(list);

		// 3) 정렬된 List 의 문자열들을 HashMap 에 맵핑하여, 정수를 꺼내어 출력
		int count = 1;
		for (String s : list) {
			int num = map.get(s);
			sb.append(num).append(" ");

			if (count % 10 == 0)
				sb.append("\n");

			count++;
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(
				new InputStreamReader(System.in)
		);
		StringTokenizer st = new StringTokenizer(br.readLine());

		m = Integer.parseInt(st.nextToken());
		n = Integer.parseInt(st.nextToken());

		numberStrArr = new String[] {
				"zero", "one", "two", "three", "four",
				"five", "six", "seven", "eight", "nine"
		};

		solution();
		System.out.println(sb);
	}
}

배운점

  1. StringBuilder를 초기화 하는 지점에 신경쓰자.
    이전 코드에서는 new StringBuilder()가 반복문 이전에 선언되어있었다.
    그러다 보니 1=one, 2=one two, 3=one two three 이렇게 복사붙여넣기가 되었다.
Map<Integer, String> temp = new HashMap<>();
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < numbers.size(); i++) {
            String target = String.valueOf(numbers.get(i));
            for (int j = 0; j < target.length(); j++) {
                char c = target.charAt(j);
                int candidate = Character.getNumericValue(c);
                if (dictionary.containsKey(candidate)) {
                    sb.append(dictionary.get(candidate));
                    sb.append(" ");
                }
            }
  1. treemap => https://coding-factory.tistory.com/557

  2. list가 {1,2,3}이고, map이 {1:one, 2:two, 3:three}일 때,
    String num = map.get(1); -> one으로 가져올 수 있다.

profile
화려한 외면이 아닌 단단한 내면

0개의 댓글