https://school.programmers.co.kr/learn/courses/30/lessons/120913
- string.substr("시작 위치", "길이") 또는 string.substr("시작 위치")
시작 위치부터 해당 길이만큼 문자열 자름 - string.substring("시작 위치", "종료 위치") 또는 substring("시작위치")
시작 위치에서 종료 위치까지 문자열 자름, 종료 위치의 -1까지 문자열 자름 - string.slice("시작 위치", "종료 위치") 또는 slice("시작 위치")
substring( )과 동일, 다른 점은 음수(-)를 자유롭게 사용할 수 있어서 뒤에서부터 문자열을 자를 때 유용
1. 내가 푼 풀이: ArrayList(List)와 StringBuilder로 풀이
import java.util.ArrayList;
import java.util.List
class Solution {
public String[] solution(String my_str, int n) {
StringBuilder sb = new StringBuilder();
List<String> list = new ArrayList<>();
for(int i=0;i<my_str.length();i++) {
if(i != 0 && i%n == 0) {
list.add(sb.toString());
sb.delete(0,n);
}
sb.append(my_str.charAt(i));
if(i == my_str.length()-1) list.add(sb.toString());
}
String[] answer = list.toArray(new String[list.size()]);
return answer;
}
}
- 수학적으로 좀 풀고 싶었는데 아쉽게도 그러지 못하고 stringbuilder와 list를 사용해서 풀었다..
- my_str 길이만큼 도는데 n의 배수일 때마다 list에 stringbuilder에 있는 것을 넣고, my_str 길이의 마지막일 때도 넣는다..!
- ArrayList를 배열로 변환할 때 => 배열[ ] answer = list.toArray(new 배열[ ]) 이다!!
2. ArrayList로 풀이
import java.util.ArrayList;
class Solution {
public ArrayList solution(String my_str, int n) {
ArrayList<String> answer = new ArrayList<>();
int i=0;
while(true){
if(i+n>=my_str.length()){ // 배열 마지막 일 때만 실행
answer.add(my_str.substring(i, my_str.length()));
break;
}
answer.add(my_str.substring(i, i+n));
i+=n; // 6, 12
}
return answer;
}
}
- 다른 분들은 어떻게 풀었나 궁금했는데 로직은 비슷한데 이 분은 while문으로 했다.
- answer list에 substring으로 문자열을 넣고, (ex, 12+6 = 18일 때, my_str.length() 보다 크니까, idx 12부터 끝까지) 배열 마지막일 때 substring으로 자른다.
- for문으로는 할 수 가 없다.. i+n>=my_str.length()가 아예 성립이 안되서..!
- 로직은 나와 비슷한데 이렇게 하면 while문을 더 짧게 돌릴 수 있으니까 시간도 훨씬 줄어든다..!
3. 수학적인 풀이
class Solution {
public String[] solution(String my_str, int n) {
int length = (my_str.length() + n - 1) / n;
String[] answer = new String[length];
for (int i = 0; i < length; i++) {
int start = n * i;
int end = start + n >= my_str.length()? my_str.length() : start + n;
answer[i] = my_str.substring(start, end);
}
return answer;
}
}
- 내가 제일 하고 싶었던 풀이..
- for문 length를 어떻게 할지 고민했는데 위의 length 처럼 하면된다..! (string크기 + n - 1)/n => 이게 무슨 공식일까..? 혹시나 나중에 쓸 일이 있을 수도 있을 것 같다..!
- end가 start + n 이 배열 길이보다 더 커질 때 end에 my_str.length()를 넣고, 아닐 때는 그냥 자르기!
- ex) start 0일 때 end 6, start 6일 때 end 12, start 12일 때 end 16
- 1번과 2번보다 3번이 더 시간이 오래걸리긴 했다 아무래도 ArrayList가 아니라 그냥 String 배열에 넣어서 그런 것 같다.
1 + 3번
import java.util.*;
class Solution {
public String[] solution(String my_str, int n) {
int length = (my_str.length() + n - 1) / n;
List<String> list = new ArrayList<>();
for (int i = 0; i < length; i++) {
int start = n * i;
int end = start + n > my_str.length()? my_str.length() : start + n;
list.add(my_str.substring(start, end));
}
String[] answer = list.toArray(new String[list.size()]);
return answer;
}
}
- 일반배열보다 리스트가 더 빠름!
'algorithm > Programmers' 카테고리의 다른 글
[JAVA]숨어있는 숫자의 덧셈 (2) (0) | 2023.03.25 |
---|---|
[JAVA] 이진수 더하기 (0) | 2023.03.23 |
[JAVA] K의 개수 (0) | 2023.03.20 |
[JAVA] A로 B 만들기 (0) | 2023.03.20 |
[JAVA] 문자열 정렬하기 (2) (0) | 2023.03.20 |