1 minute read

외계행성의 나이

문제 설명

우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, …, j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때 PROGRAMMER-962식 나이를 return하도록 solution 함수를 완성해주세요.


제한사항

  • age는 자연수입니다.
  • age ≤ 1,000
  • PROGRAMMERS-962 행성은 알파벳 소문자만 사용합니다.

입출력 예

age result
23 “cd”
51 “fb”
100 “baa”

입출력 예 설명

입출력 예 #1

  • age가 23이므로 “cd”를 return합니다.

입출력 예 #2

  • age가 51이므로 “fb”를 return합니다.

입출력 예 #3

  • age가 100이므로 “baa”를 return합니다.

나의 풀이 코드

import java.util.HashMap;
class Solution {
    public String solution(int age) {
        
        String str = Integer.toString(age);

        HashMap<Character, String> map = new HashMap<>();
        map.put('0', "a"); //""와 '' 구분해야함. ""는 String이고 ''는 캐릭터
        map.put('1', "b");
        map.put('2', "c");
        map.put('3', "d");
        map.put('4', "e");
        map.put('5', "f");
        map.put('6', "g");
        map.put('7', "h");
        map.put('8', "i");
        map.put('9', "j");
        
        StringBuilder sb = new StringBuilder();
        
        for (int i=0; i<str.length(); i++){
            sb.append(map.get(str.charAt(i)));    
        }
        
        
        String answer = sb.toString();
        return answer;
    }
}


age 숫자를 문자열로 변환하고, 문자열로 변환된 각 숫자를 알파벳 문자로 매핑하는 방식으로 변환한다.

이후 map.get하여 반복하여 StringBuilder로 append한다.

hash map을 처음 써보았는데 map.put을 반복문으로 하고 싶었지만 실패했다.

배운점

import java.util.stream.Collectors;

class Solution {
    public String solution(int age) {
        return String.valueOf(age)
                        .chars()
                        .mapToObj(operand -> String.valueOf((char) (49 + operand)))
                        .collect(Collectors.joining());
    }
}

남이 푼 코드를 보면 스트림을 이용한다.

마찬가지로 age를 문자열로 변환하고 문자열을 스트림으로 변환후 각 요소aperand를 아스키코드 49를 더해 숫자를 알파벳으로 바꾼다. 이후 각 매핑된 문자를 join한다.


class Solution {
    public String solution(int age) {
        StringBuilder sb = new StringBuilder();

        while(age > 0) {
            sb.insert(0, (char) ((age % 10) + (int)'a'));
            age /= 10;
        }

        return sb.toString();
    }
}

또다른 남이 푼 코드를 보면 반복문안에서 모든 작업을 한다.

하나씩 보자면, 먼저 age를 10으로 나눈 나머지 이므로 일의 자릿수를 구하고 알파벳 a의 아스키 숫자를 더한다. 즉 0이면 a가 되고 1은 b가 되는식이다.

이후, age를 10으로 나누면 일의 자릿수가 사라지고 10의 자릿수가 일의자릿수가 된다.

다시 위 방식을 반복하며 insert(0,)을 통해 각 자릿수를 변환할때마다 제일 앞에 삽입이 된다.

Leave a comment