본문 바로가기
algorithm/Programmers

[JAVA] 잘라서 배열로 저장하기

by 이쟝 2023. 3. 23.

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

 

프로그래머스

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

programmers.co.kr

  • 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