프로그래머스/Lv. 0(코딩테스트 입문)

[프로그래머스 코딩테스트] 잘라서 배열로 저장하기(Java)

Sigfriede 2023. 4. 10. 20:39

  문제 설명

  문자열 my_str과 n이 매개변수로 주어질 때, my_str을 길이 n씩 잘라서 저장한 배열을 return 하도록 solution 함수를 완성해주세요.

 

  제한사항

  • 1 <= my_str의 길이 <= 100
  • 1 <= n <= my_str의 길이
  • my_str은 알파벳 소문자, 대문자, 숫자로 이루어져 있습니다.

 

  입출력 예

my_str n result
"abc1Addfggg4556b" 6 ["abc1Ad", "dfggg4", "556b"]
"abcdef123" 3 ["abc", "def", "123"]
class Solution {
    public String[] solution(String my_str, int n) {
        int size = (int)Math.ceil((double)my_str.length() / n);
        String[] answer = new String[size];
        int index = 0;
        for (int i = 0; i < my_str.length(); i += n) {
            int endIndex = Math.min(i + n, my_str.length());
            answer[index++] = my_str.substring(i, endIndex);
        }
        return answer;
    }
}

  우선 answer 배열의 크기가 될 size 변수를 만들어줍니다. Math 클래스의 ceil은 올림을 해주는 메소드입니다. 이 메소드는 double형의 인수를 받으므로 double로 형변환을 했습니다. size 변수는 my_str의 길이를 n으로 나눈 값을 올림한 값으로 할당받게 될 것입니다. 값을 올림처리하는 이유는 입출력 예에 나와있습니다. 1번 예시의 문자열의 길이는 16입니다. result 배열에 앞의 두 원소는 매개변수 n만큼, 즉 6만큼의 길이에 맞춰 잘려져 있는 반면에 세 번째 원소의 경우 6에 조금 못미치는, 4만큼의 길이로 쪼개졌습니다. 이는 문자열의 길이를 n만큼 나눈 뒤, 만약 나머지가 존재한다면 배열의 한 자리를 더 차지하겠다는 말이죠. 맞아떨어지는 수의 경우에는 올림처리하여도 값이 동일하므로, 예외가 발생하는 기준에 맞추었습니다.

  answer 배열의 크기에는 size를 할당합니다. answer의 index가 될 index 변수를 생성해줍니다.

  for문이 my_str의 길이만큼 순회합니다. i는 n만큼 증가합니다. endIndex는 문자열을 자를 길이의 값입니다. 모든 숫자가 딱 맞아떨어진다면 좋겠지만, 입출력 예 1번처럼 늘 맞아떨어진다는 보장이 없습니다. Math 클래스의 min 메소드로 i + n과 문자열의 길이 중에 더 짧은 쪽을 선택하는 변수입니다.

  answer의 index번에 index가 1씩 증가하면서 하나씩 값을 할당합니다. substring 메소드로 값을 i번째에서 endIndex만큼 잘라줍니다. 다시 입출력 예 1번을 예시로 들어보겠습니다.

 

answer[index++] = my_str.substring(i, endIndex)

answer[0] = my_str.substring(0, (i + n))

위 경우 i + n은 6이고, my_string.length()는 16입니다.
endIndex는 둘 중 더 짧은 6을 택할 것입니다.


answer[1] = my_str.substring(i + n, (i + n) + (i + n))

이번 substring의 인자에는 각각 6과 12가 들어갑니다.
앞선 식의 i + n은 공통값입니다. 그러나 endIndex는 미만의 값을 취급합니다.
따라서 answer[0]에서는 '0, 1, 2, 3, 4, 5' 숫자 여섯 개를,
answer[1]에서는 '6, 7, 8, 9, 10, 11' 숫자 여섯 개가 겹치지 않는 것입니다.


answer[2] = my_str.substring((i + n) + (i + n), my_str.length())

이번 substring의 인자 중, endIndex 자리에는 my_str.length()가 들어갑니다.
이번 endIndex는 3 * (i + n)과 my_str.length()를 비교합니다.
3 * (i + n)은 18, my_str.length()는 16입니다. 따라서 더 작은 후자를 택한 것입니다.
인덱스가 배열의 크기를 초과하지 않도록 설정했습니다.