본문 바로가기
TIL

자바 기초 문제(커서 편집기)

by 도쿠니 2022. 3. 29.

제로베이스 백엔드 스쿨에서 연습문제가 나오길래 한번 풀어보았다.

 

편집기에는 문자열과 편집 명령어가 주어지는데, 명령어의 동작은 다음과 같다고 한다.

 

L : 커서를 왼쪽으로 한칸 이동(커서가 문장의 맨 앞이면 무시)

D : 커서를 오른쪽으로 한칸 이동(커서가 문장의 맨 뒤이면 무시)

B : 커서 왼쪽에 있는 문자를 삭제(커서가 문장의 맨 앞이면 무시)

P x : x라는 문자를 커서 왼쪽에 추가

 

커서의 시작은 문자열에서 편집이 시작되는 위치가 시작점이다.

 

초기 문자열과 명령어가 주어졌을 때 결과를 출력하라

 

라는 문제이다.

 

초기 문자열 명령어 결과 출력
"aba" "L B" "aa"
"abcd" "P x L P y" "abcdyx"

이런식으로 되어야하는데 나는 어떻게 풀었냐면

public class Test {

    public static void solution(String s,String command) {
    	// 커서의 위치를 체크, 커서의 시작점은 인덱스로 치면 주어진 문자열의 길이와 동일
        int cursor = s.length();

		
        char[] arr = command.toCharArray();
        char[] word = s.toCharArray();
        ArrayList<Character> list = new ArrayList<>();

        for (char c : word) {
             list.add(Character.valueOf(c));
        }


        for (char c : arr) {
            switch (c) {
                case 'L':
                    if (cursor == 0) {
                        continue;
                    }
                    cursor -= 1;
                    break;
                case 'D':
                    if (cursor == s.length() - 1) {
                        continue;
                    }
                    cursor += 1;
                    break;
                case 'B':
                    if (cursor == 0) {
                        continue;
                    }
                    list.remove(cursor-1);
                    break;
                case 'P':
                    break;

                case ' ' :
                    continue;

                default:
                    list.add(cursor,c);
                    cursor+=1;
                    break;
            }
        }
        String answer = "";
        for (Character character: list) {
            answer += character;
        }
        System.out.println(answer);

    }

    public static void main(String[] args) {
        solution("abcd", "P x L P y");
        solution("abc", "L L L P x L B P y");
    }

}

이거를 굳이 char로 쓸 필요 없는 것 같아서

public class Test {

    public static void solution(String s,String command) {
        // 커서의 위치를 체크, 커서의 시작점은 인덱스로 치면 주어진 문자열의 길이와 동일
        int cursor = s.length();
        String[] commandArr = command.split(" ");
        String[] wordArr = s.split("");
		
        // Arrays.asList(wordArr)로 하려그랬는데 에러뜬다..
        List<String> list = Arrays.stream(wordArr).collect(Collectors.toList());

        for (String c : commandArr) {
            switch (c) {
                case "L":
                	// 커서가 맨왼쪽에 있으면 그냥 통과
                    if (cursor == 0) {
                        continue;
                    }
                    // 맨왼쪽아니면 cursor를 왼쪽으로 한칸 이동
                    cursor -= 1;
                    break;
                case "D":
                	// 커서가 맨 오른쪽이면 통과
                    if (cursor == s.length() - 1) {
                        continue;
                    }
                    // 아니면 커서를 오른쪽으로 한칸 이동
                    cursor += 1;
                    break;
                case "B":
                	// 커서가 맨왼쪽이면 삭제하지않고 통과
                    if (cursor == 0) {
                        continue;
                    }
                    
                    // 커서의 왼편 삭제
                    list.remove(cursor-1);
                    break;
                case "P":
                    break;
                default:
                	// 정의된 명령어 외의 값이 들어오면 추가
                    list.add(cursor,c);
                    // 커서자리에 추가되었으니 커서를 한칸 오른쪽으로 이동
                    cursor+=1;
                    break;
            }
        }
        String answer = "";
        for (String s1 : list) {
            answer += s1;
        }

        System.out.println(answer);

    }

    public static void main(String[] args) {
        solution("abcd", "P x L P y");
        solution("abc", "L L L P x L B P y");
    }

}

댓글