코딩테스트 회고록/코테_Java

[JAVA] 프로그래머스 - 외계행성의 나이

iamjisu 2023. 3. 28. 23:39

프로그래머스 코딩테스트 연습 입문단계 '외계행성의 나이' 문제입니다.

https://school.programmers.co.kr/learn/courses/30/lessons/120834

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


❓ 문제 설명

우주여행을 하던 머쓱이는 엔진 고장으로 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 행성은 알파벳 소문자만 사용합니다.

 

입력

23

출력

"cd"
// age가 23이므로 "cd"를 return합니다.

🔍 알고리즘 구상

  • 매개변수로 받은 age를 자리수대로 자른다
  • 자리수대로 자른 age를 해당하는 문자의 아스키코드의 숫자로 만든다
  • char타입으로 변환한다
  • String으로 변환한 뒤 return한다

자리수대로 자르는 과정이 어려울 것 같았습니다.


✏️ 직접 구현한 코드

import java.util.*;

class Solution {
    public String solution(int age) {
        String answer = "";
        ArrayList<Character> l = new ArrayList<>();
        for(int i = age; i > 0; i /= 10) {  // 23 2
            l.add(0,(char)((i % 10)+97));
        }
        for(int i = 0; i < l.size(); i++) {
            answer += String.valueOf(l.get(i));
        }
        return answer;
    }
}

🗣️ 코드 설명

  • 결과를 더 유동적으로 저장하기 위해 배열보다, 리스트를 사용했습니다. Character타입의 데이터를 저장할 리스트를 선언했습니다.
  • i가 age값부터 10씩 나눠지지고, 0보다 클 때까지만 반복하는 첫 번째 for문을 만들었습니다.
  • 첫 번째 for문안에서는 i를 10으로 나눈 나머지값에 97을 더하고 그 값을 char로 명시적형변환을 했습니다. 알파벳 소문자의 아스키 코드를 활용한 것입니다(a의 아스키코드 == 97).
  • 또 첫 번째 for문에 리스트에 값을 넣을 때, 마지막에 넣지 않고 가장 앞자리에 값을 넣도록 앞에 인덱스값을 주었습니다.
  • 두 번째 for문은 i 값이 리스트의 사이즈보다 작을 때까지 증가하며 반복하는 두 번째 for문을 만들었고, 그 안에서 리스트의 값을 get() 메서드로 받아 String으로 변환한 뒤, answer값에 더했습니다.

🔥 다른 사람의 코드

class Solution {
    public String solution(int age) {
        String answer = "";
        String[] alpha = new String[]{"a","b","c","d","e","f","g","h","i","j"};

        while(age>0){
            answer = alpha[age % 10] + answer;
            age /= 10;
        }

        return answer;
    }
}

이 분은 age의 자리수들을 인덱스로 활용했네요.

age의 자리수를 구하는 방법은 while문을 쓴 것과 for문을 쓴 것만 다르고 제 코드와 같습니다!!

그리고 지금은 list를 활용하는 것을 연습하고 싶어서 list를 자주 사용하고 있는데,

다음에는 list보다 배열을 더 활용해 봐야겠습니다.


⭐ 기억하고 넘어갈

  •  자리수 구하는 알고리즘 

반복문을 이용하고, 10을 나눈 몫과 나머지를 활용한다.

 

 

  •  list에 지정한 인덱스로 add하는 방법 
ArrayList<Character> l = new ArrayList<>(Arrays.asList('강','아','지'));

l.add(1,'A');

// l == ['강','A','아','지']

 

  •  String.valueOf() 

배열만 String으로 변환할 수 있는 줄 알았는데, list의 값도 변환할 수 있다.