Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags more
Archives
Today
Total
관리 메뉴

David의 블로그

프로그래머스 - 왼쪽 오른쪽 본문

프로그래밍/코딩

프로그래머스 - 왼쪽 오른쪽

David 리 2024. 6. 30. 00:39

문제설명>

문자열 리스트 str_list에는 "u", "d", "l", "r" 네 개의 문자열이 여러 개 저장되어 있습니다. 
str_list에서 "l"과 "r" 중 먼저 나오는 문자열이 "l"이라면 해당 문자열을 기준으로 왼쪽에 있는 문자열들을 순서대로 담은 리스트를, 
먼저 나오는 문자열이 "r"이라면 해당 문자열을 기준으로 오른쪽에 있는 문자열들을 순서대로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
 "l"이나 "r"이 없다면 빈 리스트를 return합니다.

 

내 생각>

처음에는 str_list를 순회하여 "l"이나 "r"을 만날때까지 하나하나 값을 담는 식으로 풀어보려 했으나,

이는 곧 문제에 직면했다. "l"을 만나면 해당 문자열 기준으로 좌측에 있는 값들을 담고, "r"을 만나면 우측에 있는 값들을 담아야 했야했다. 어떤 문자열이 올지 모르는데, 무작정 값을 담는것은 무리가 있었다.

Arrays의 깊은 복사를 이용해야겠다고 생각했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 왼쪽 오른쪽
//        ["u", "u", "l", "r"]    ["u", "u"]
//        ["l"]                    []
        
        String[] str_list = {"u""u""l""r"};
        String[] answer = {};
        
        // left = true / right = fals
        boolean leftAndRight = true;
        int copyIdx = 0;
        
        for (int i = 0; i < str_list.length; i++) {
            if (str_list[i].equalsIgnoreCase("l")) {
                leftAndRight = true;
                copyIdx = i;
                break;
            } else if (str_list[i].equalsIgnoreCase("r")) {
                leftAndRight = false;
                copyIdx = i + 1;
                break;
            }
        }
        
        // left
        if (leftAndRight) {
            answer = Arrays.copyOfRange(str_list, 0, copyIdx);
        } 
// right
else if (!leftAndRight) {
            answer = Arrays.copyOfRange(str_list, copyIdx, str_list.length);
        }
        
        System.out.println(Arrays.toString(answer));
cs

 

왼쪽/오른쪽 값을 담을지 정하는 boolean 변수 leftAndRight를 이용하여,

"l"을 만나면 true로 반대면 false로 초기화했다.

그리고 배열 깊은복사에 필요한 인덱스변수값 copyIdx도 초기화가 필요했다.

"l"일 때, copyIdx는 해당 문장열 index를 반대인 경우는 +1을 해줬다.