프로그래머스/Lv. 0(코딩 기초 트레이닝)

[프로그래머스 코딩테스트] 왼쪽 오른쪽(Java)

Sigfriede 2023. 5. 31. 01:00

  문제 설명

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

 

  제한사항

  • 1 <= str_list의 길이 <= 20
  • str_list는 "u", "d", "l", "r" 네 개의 문자열로 이루어져 있습니다.

 

  입출력 예

str_list result
["u", "u", "l", "r"] ["u", "u"]
["l"] []
import java.util.Arrays;
class Solution {
    public String[] solution(String[] str_list) {
        int len = str_list.length;
        int indexL = len;
        int indexR = len;
        String[] answer = {};
        for (int i = 0; i < len; i++) {
            if (str_list[i].equals("l") && indexL == len) {
                indexL = i;
            } else if (str_list[i].equals("r") && indexR == len) {
                indexR = i;
            }
        }
        if (indexL == len && indexR == len) {
            answer = new String[0];
        } else if (indexL < indexR) {
            answer = Arrays.copyOf(str_list, indexL);
        } else if (indexL > indexR) {
            answer = Arrays.copyOfRange(str_list, indexR + 1, len);
        }
        return answer;
    }
}

  str_list의 길이를 담는 변수 len을 생성합니다. 반복적으로 들어가는 부분이 많아 생략하기 위함입니다.

  indexL과 indexR은 각각 l과 r이 처음으로 등장하는 위치를 가리키는 변수입니다. 처음에는 -1로 초기화를 했는데 자꾸 오류가 발생해서, 인덱스에 해당하지 않는 값인 str_list의 길이로 지정해주었습니다.

  for문이 len만큼 순회합니다. if문에서 str_list의 i번째 원소가 l과 같고 동시에 indexL이 len과 같다면 i를 indexL에 할당합니다. 값이 변경되었으므로 두 번째 등장한다면 indexL == len 조건을 충족하지 못해 변경되지 않을 것입니다.

  else if에서 str_list의 i번째 원소가 r과 같고 동시에 indexR이 len과 같다면 indexR에 i를 할당합니다. 앞선 설명과 동일합니다.

  두 번째 if문에서 indexL과 len이 같고 동시에 indexR과 len이 같다면 둘 다 초기화 값이 변경되지 않았다는 것을 의미합니다. 이는 배열에 l과 r이 둘 다 없다는 것을 의미하기도 합니다. 따라서 배열의 크기를 0으로 지정하여 빈 배열을 반환하도록 합니다.

  첫 번째 else if에서 indexL이 R보다 작다면 L이 먼저 등장했다는 뜻입니다. answer에 Arrays 클래스의 copyOf 메소드를 이용하여 str_list를 0번 인덱스부터 indexL번(은 포함하지 않고) 인덱스까지 복사합니다.

  두 번째 else if에서 indexL이 R보다 크다면 R이 먼저 등장했다는 뜻입니다. answer에 Arrays 클래스의 copyOfRange 메소드를 이용하여 str_list를 복사하고 indexR + 1번 인덱스부터 len번 인덱스까지 복사합니다. + 1을 하는 이유는 복사한 배열이 r을 포함하지 않아야 하기 때문입니다. len은 배열의 크기를 초과하지만 len을 포함하지 않으므로 str_list - 1과 동일한 범위입니다.

  문제에서 요구하는 조건을 직관적으로 풀이한 편입니다. 그러나 보다 간략한 풀이도 존재하므로 요구하는 조건을 모두 명시적으로 풀이하지는 않아도 된다는 점을 명심해야 할 것 같습니다. 모든 조건을 서술하려다 보니 불필요하게 코드가 길어지는 경향이 있습니다.