[알고리즘]문자열 재구성

ByWindow·2020년 11월 9일
0

Algorithm

목록 보기
6/104
post-thumbnail

1. 문제

문제 설명

문자열이 주어졌을 때 동일한 문자가 서로 인접하지 않도록 재배열 할 수 있는지 여부를 판단하고 재배열한 것을 출력한다

제한사항

  • 문자열은 500자 이내로 한정한다

입출력 예

inputoutput
"aab""aba"
"aaab"""

2. 아이디어

  • input을 String[]의 배열로 저장split하고 ArrayList에 복사
  • 문자별로 해당 문자가 몇 번 등장하는지 파악
    • 반복문을 돌며 리스트의 첫번째에 있는 알파벳과 같은 알파벳이 있는 리스트의 요소를 찾는다
    • 리스트의 마지막 요소부터 첫번째 요소로 즉, 역순으로 검색한다
    • 같은 것이 발견되면 해당 요소를 리스트에서 제거한다
  • 같은 글자가 ((input의 총 길이+1)/2)보다 크면 성립하지 않으므로 프로그램 종료
  • swap으로 재배열

3. 코드

public static String solution(String input){

        String output = "";
        String[] arr_input = input.split("");//input의 각 글자를 배열형태로 저장
        //위에서 선언한 배열을 Arraylist형태에 복사한다
        ArrayList<String> arr_str = new ArrayList<>();
        for(String s : arr_input){
            arr_str.add(s);
        }

        for(int i = 0; i < arr_str.size();){
            String first = arr_str.get(0);//리스트의 첫번째 글자와 같은 것들을 찾는다
            int sum = 0;//같은 것이 총 몇 개인지 기록
            //뒤에서부터 검색하고 삭제해야 리스트의 인덱스 값에 영향이 없다
            for(int j = arr_str.size()-1; j >= 0; j--){
                //같은 글자가 발견된다면
                if(arr_str.get(j).equals(first)){
                    sum++;//같은 것의 갯수를 1만큼 증가
                    arr_str.remove(j);//리스트에서 그 값을 제거한다
                }
            }
            //같은 글자가 ((총 길이+1)/2)보다 크면 성립하지 않으므로 프로그램 종료
            if(sum > (input.length()+1)/2){
                output = "";
                System.exit(0);
            }
        }
        //해당 인덱스와 그보다 1만큼 작은 인덱스의 값을 비교하고 같으면 해당 인덱스의 값을 다른 것과 스왑한다.
        for(int i = 1; i < arr_input.length-1; i++){
            if(arr_input[i-1].equals(arr_input[i])){
                for(int j = i+1; j < arr_input.length; j++){
                    //다른 것이 발견된다면 스왑!
                    if(!arr_input[j].equals(arr_input[i])){
                        String temp = arr_input[j];
                        arr_input[j] = arr_input[i];
                        arr_input[i] = temp;
                    }
                }
            }
        }

        for(String s : arr_input){
            output += s;
        }

        return output;
    }

    public static void main(String[] args) {

        String input = "abaacb";
        System.out.println(solution(input));

    }

4. end...

확실히 split함수는 많은 곳에서 유용하게 활용된다
ArrayList 관련 함수들과 그 동작원리도 익혀둬야겠다

profile
step by step...my devlog

0개의 댓글