<문제 제시>
문자열 my_str과 n이 매개변수로 주어질 때, my_str을 길이 n씩 잘라서 저장한 배열을 return하도록 solution 함수를 완성해주세요.
<예시 입출력>
<문제 해결 과정>
필요한 기능을 먼저 생각해보았다.
1) 문자열의 길이를 알아내는 length() 메서드
2) 문자열을 잘라내는 split() 메서드
3) 조각낸 문자열을 담아내는 문자열 리스트,
4) 나머지를 분석할 변수
Try 1) 인덱스 범위 오류
public static String[] solution(String my_str, int n) {
String[] split_arr = my_str.split("");
int length = split_arr.length;
int answer_len = length / n + 1;
String[] answer = new String[answer_len];
answer[0] = split_arr[0];
int k = 0;
for(int i = 0; i < answer_len; i++) {
answer[k] = split_arr[k];
k += n-1;
}
System.out.println(Arrays.toString(split_arr));
System.out.println(length);
int j = 0;
for(int i = 0; i < n; i++){
answer[j] = split_arr[i];
}
return answer;
}
answer 배열과 split_arr 배열을 같이 관리하며 갱신을 하고자 했지만, split_arr 배열에서 인덱스 범위 오류가
발생한 것 같았다.
기능별로 다시 구현해보기로하였다.
Solution 1) 수정결과
1) my_str이 n만큼 잘랐을때 남는 부분이 없는 경우와 (나누어 떨어지는 경우)
// answer의 길이 지정 = 문자열 my_str의 길이에서 자를 칸 수(n)만큼 나눈 후 +1을 더하기도 함 = 뒤에 잘리는 나머지도 담기 위함
if(my_str.length() % n == 0) { // 나머지가 없이 나누어 떨어지는 경우
length = my_str.length() / n;
}
2) my_str을 n만큼 잘라내어도 남는 부분이 있는 경우 (나누어 떨어지지 않는 경우)
else if(my_str.length() % n != 0) { // 나머지를 담는 경우
length = my_str.length() / n + 1;
}
▼ 갱신된 길이만큼 answer의 길이를 설정해준다.
String[] answer = new String[length];
▼ my_str을 split("")로 공백없이 문자 별로 분할해내어 split_arr 배열에 담는다.
// 문자열 my_str을 조각내어 split_arr 문자열배열에 담음
String[] split_arr = my_str.split("");
my_str의 길이를 diff라는 나머지 변수에 저장해주고, 이 diff변수를 잘라낼때마다
diff -= n 을 해주어 갱신해준다.
나머지를 더해주는 임시저장소 save를 통해 save += split_arr[인덱스] 를 해준다.
<전체코드>
import java.util.Arrays;
//#. 잘라서 배열로 저장하기
/* <문제설명>
문자열 my_str과 n이 매개변수로 주어질 때,
my_str을 길이 n씩 잘라서 저장한 배열을 return하도록
solution 함수를 완성해주세요.
*/
public class cut_array {
public static String[] solution(String my_str, int n) {
int length = 0;
// answer의 길이 지정 = 문자열 my_str의 길이에서 자를 칸 수(n)만큼 나눈 후 +1을 더하기도 함 = 뒤에 잘리는 나머지도 담기 위함
if(my_str.length() % n == 0) { // 나머지가 없이 나누어 떨어지는 경우
length = my_str.length() / n;
}
else if(my_str.length() % n != 0) { // 나머지를 담는 경우
length = my_str.length() / n + 1;
}
String[] answer = new String[length];
// 문자열 my_str을 조각내어 split_arr 문자열배열에 담음
String[] split_arr = my_str.split("");
// 나머지를 구하기 위한 변수
int diff = my_str.length();
// 나머지를 더할때의 경우 접근하기 위한 변수
int count = 0;
while(true) {
// 나머지가 주어진 칸 수 (n)보다 작으면 break;
if(diff < n) break;
// diff를 n으로 지속적으로 차감 = (my_str.length() % n)와 같은 맥락
diff -= n;
count++;
}
for(int i = 0; i < length ; i++) {
// answer의 인덱스 별 저장해줄 임시 저장소 선언
String save = "";
// i가 마지막 나머지 원소들에 접근할 시점이 되면
if(i == count) {
// 초기값은 주어진 칸 수 (n)에서 count만큼 곱해진것에서 시작
// 기존 문자열 길이의 끝까지 반복
for(int k = n*count; k < my_str.length(); k++) {
save += split_arr[k];
}
answer[i] = save;
break; // i에 대한 for반복문을 종료시킴
}
// 그 외의 경우
// 초기값은 0*n = 0 부터 해서 n의 배수로 증가
// 범위지정은 갱신되는 j값을 기준으로 +n 인 값
for(int j = i*n; j < i * n + n ; j++) {
save += split_arr[j];
}
answer[i] = save;
}
return answer;
}
}
배열을 응용하는 문제였지만, 잘라내서 갱신하는 부분과 나머지를 처리하는 로직 등에 어려움이 있었다.
다른 임시 변수들을 통해 잘라내어놓고 다시 추가하는 등의 해결방안을 찾아서 풀 수 있었다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120913
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '두 수의 나눗셈' - Java (0) | 2022.12.18 |
---|---|
[프로그래머스] '종이 자르기' - Java (0) | 2022.12.18 |
[프로그래머스] '배열 자르기' - Java (0) | 2022.12.17 |
[프로그래머스] '연속된 수의 합' - Java (2) | 2022.12.16 |
[프로그래머스] '7의 개수' - Java (0) | 2022.12.15 |