[코딩테스트]백준 - 항해99클럽 코딩테스트 스터디 31일차 : 숫자놀이

Co-Zi·2024년 11월 28일
0

99클럽TIL

목록 보기
13/15
post-thumbnail

해당 글은 항해99 클럽 코딩테스트 스터디에서 진행된 31일차(20241127) 비기너 문제에 대한
TIL(Today I Learned) 내용입니다.

	문제 출처) https://www.acmicpc.net/problem/1755
    

문제해결에 활용한 핵심포인트!

이 문제에서 주목해야할 부분은 다음과 같다.

1. 주요조건

  • 79를 영어로 읽되 숫자 단위로 하나씩 읽는다면 "seven nine"이 된다. 80은 마찬가지로 "eight zero"라고 읽는다. 79는 80보다 작지만, 영어로 숫자 하나씩 읽는다면 "eight zero"가 "seven nine"보다 사전순으로 먼저 온다.
	(1) M 이상 N 이하의 정수를 숫자 하나씩 읽었을 때를 기준
    
	(2) 사전순으로 정렬하여
    
	(3) 출력

2. 입력

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

  • 정수 M, N(1 ≤ M ≤ N ≤ 99)


3. 출력

  • 정수를 숫자 하나씩 읽었을 때를 기준으로 사전순으로 정렬하여 출력

  • 한 줄에 10개씩 출력


풀이방향

(1) 입력, 출력을 위한 클래스 준비 및 실제 입력 받기

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

(2) 사전 만들기 - 정수를 문자열로, 또는 문자열을 정수로 변환해주기 위해서 사전(dictionary)을 활용한다.
  • 자바에는 사전(dictionary)클래스가 없으므로 HashMap을 활용해 만들어준다.

  • 0~9까지의 정수에 대해서 각각에 문자열 "zero", "one" ... 대응시켜 HashMap을 생성한다.

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

        HashMap<String, Integer> hm= new HashMap<>();

        for (int i = 0; i < 10; i++) {
            hm.put(num[i], i);
        }

(3) 핵심 풀이 과정

  • 숫자를 문자로 변환한 배열 생성
    - 10 미만인 숫자: num 배열에서 인덱스 그대로 활용해서 가져올 수 있다.
    - 10 이상인 숫자: 십의자리 숫자와 일의자리 숫자를 구분하고, 그 각각에 해당하는 num[i]를 갖고온다.
        for (int i = m; i <= n; i++) {
            if (i < 10) {
                str[count++] = num[i];
            } else {
                str[count++] = num[i/10] + " " + num[i%10];
            }
        }

  • 정렬
    - 숫자를 문자로 변환한 배열을 알파벳순으로 정렬한다.
        Arrays.sort(str);
    	
  • 문자를 숫자로 변환한 배열 생성
    - 정렬한 결과의 배열에 대해서 진행
    • str[i]에 대해서 StringTokenizer의 nextTokens()에 대해서 사전(dictionary) HashMap에서 문자에 대응하는 정수로 변환한다.
    • str[i]에 대해서 StringTokenizer의 hasNextTokens()를 활용하여, 한자리인지, 두자리인지 확인 가능하다.
        for (int i = 0; i < count; i++) {
            st = new StringTokenizer(str[i]);
            out[i] = hm.get(st.nextToken());
            if (st.hasMoreTokens()) {
                out[i] = out[i] * 10 + hm.get(st.nextToken());
            }
        }

(4) 조건에 맞게 출력

  • 한 줄에 10개씩
  • bw.close()까지 해줘야 출력 가능
        for (int i = 0; i < count; i++) {
            bw.write(out[i] + " ");
            if (i % 10 == 9) {
                bw.write("\n");
            }
        }

        bw.close();
profile
한걸음 한걸음

0개의 댓글