
내가 생각했을때 문제에서 원하는부분
문자열 리스트 str_list에는 "u", "d", "l", "r" 네 개의 문자열이 여러 개 저장되어 있습니다.
str_list에서 "l"과 "r" 중 먼저 나오는 문자열이 "l"이라면 해당 문자열을 기준으로 왼쪽에 있는 문자열들을 순서대로 담은 리스트를, 먼저 나오는 문자열이 "r"이라면 해당 문자열을 기준으로 오른쪽에 있는 문자열들을 순서대로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
"l"이나 "r"이 없다면 빈 리스트를 return합니다.
내가 이 문제를 보고 생각해본 부분
문자열 배열 str_list에서 문자 "l"과 "r" 중 먼저 등장하는 문자를 기준으로 특정 부분을 잘라 반환하는 문제이다.
먼저 indexL과 indexR 변수를 -1로 초기화한다. 이는 "l"과 "r"이 배열 내에서 발견되지 않았음을 의미한다.
for 반복문으로 배열을 처음부터 끝까지 탐색하며, "l"이 처음 등장하는 인덱스를 indexL에 저장하고, "r"이 처음 등장하는 인덱스를 indexR에 저장한다.
두 인덱스가 모두 발견되면 탐색을 중단한다. 이는 불필요한 탐색을 줄여 효율성을 높인다.
만약 "l"과 "r" 모두 배열에 없다면 빈 배열을 반환한다.
"l"이 먼저 등장했거나 "r"이 없으면 indexL을 기준으로 배열의 0부터 indexL 앞까지 부분 배열을 잘라서 반환한다.
"r"이 먼저 등장했거나 "l"이 없으면 indexR 이후부터 배열 끝까지 부분 배열을 잘라서 반환한다.
어떤 경우에도 해당되지 않으면 빈 배열을 반환한다. 다만 이 부분은 논리적으로 이미 처리되었기에 도달하기 어렵다.
main 메서드에서는 두 가지 테스트 케이스를 실행해 각각 결과를 출력한다.
코드로 구현
import java.util.Arrays;
class Solution {
public String[] solution(String[] str_list) {
int indexL = -1;
int indexR = -1;
for (int i = 0; i < str_list.length; i++) {
if (str_list[i].equals("l") && indexL == -1) {
indexL = i;
}
if (str_list[i].equals("r") && indexR == -1) {
indexR = i;
}
if (indexL != -1 && indexR != -1) {
break;
}
}
if (indexL == -1 && indexR == -1) {
return new String[]{};
}
if (indexL != -1 && (indexR == -1 || indexL < indexR)) {
return Arrays.copyOfRange(str_list, 0, indexL);
}
if (indexR != -1 && (indexL == -1 || indexR < indexL)) {
return Arrays.copyOfRange(str_list, indexR + 1, str_list.length);
}
return new String[]{};
}
}
프로그래머스 코드
package programmers;
import java.util.Arrays;
// 프로그래머스 왼쪽 오른쪽
public class Main55 {
public static String[] solution(String[] str_list) {
int indexL = -1;
int indexR = -1;
for (int i = 0; i < str_list.length; i++) {
if (str_list[i].equals("l") && indexL == -1) {
indexL = i;
}
if (str_list[i].equals("r") && indexR == -1) {
indexR = i;
}
if (indexL != -1 && indexR != -1) {
break;
}
}
if (indexL == -1 && indexR == -1) {
return new String[]{};
}
if (indexL != -1 && (indexR == -1 || indexL < indexR)) {
return Arrays.copyOfRange(str_list, 0, indexL);
}
if (indexR != -1 && (indexL == -1 || indexR < indexL)) {
return Arrays.copyOfRange(str_list, indexR + 1, str_list.length);
}
return new String[]{};
}
public static void main(String[] args) {
String[] example1 = {"u", "u", "l", "r"};
String[] example2 = {"l"};
System.out.println(Arrays.toString(solution(example1))); // [u, u]
System.out.println(Arrays.toString(solution(example2))); // []
}
}
위에 있는 코드를 변경한 코드
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.