[프로그래머스] 서울에서 김서방 찾기(JAVA)

업데이트:


문제 설명

String형 배열 seoul의 element중 “Kim”의 위치 x를 찾아, “김서방은 x에 있다”는 String을 반환하는 함수, solution을 완성하세요. seoul에 “Kim”은 오직 한 번만 나타나며 잘못된 값이 입력되는 경우는 없습니다.

제한사항

seoul은 길이 1 이상, 1000 이하인 배열입니다.
seoul의 원소는 길이 1 이상, 20 이하인 문자열입니다.
“Kim”은 반드시 seoul 안에 포함되어 있습니다

입출력 예

seoul return
[“Jane”, “Kim”] “김서방은 1에 있다”


JAVA 풀이 과정

첫 번째 풀이

class Solution {
    public String solution(String[] seoul) {
        String answer = "";

        for(int i = 0; i < seoul.length; i++){
            if(seoul[i].equals("Kim")){
                answer = "김서방은 " + i + "에 있다";
                break;
            }
        }
        
        return answer;
    }
}


결과


처음에는 그렇게 깊게 생각하지 않고 바로 떠오르는 for문으로 풀었다. seoul 배열을 for문으로 돌려 Kim과 똑같은 배열을 찾으면 그 인덱스를 answer에 담아 리턴했다.



두 번째 풀이

import java.util.ArrayList;
import java.util.Arrays;

class Solution {
    public String solution(String[] seoul) {
        ArrayList<String> list = new ArrayList<>(Arrays.asList(seoul));
        return "김서방은 " + list.indexOf("Kim") + "에 있다";
    }
}


결과

간단한 문제라 뭔가 아쉬워서 조금 리팩토링해봤다. 일단 seoul 배열 값들을 담은 ArrayList를 만들고 indexOf 메서드를 사용해서 바로 리턴 시켜주었다.



다른 사람 풀이

다른 사람의 풀이를 보는데 두 번째 풀이와 비슷하게 푼 코드를 봤다. 댓글들이 많이 달렸는데 indexOf의 효율성에 대한 얘기가 많이 나왔다. 이 문제에서는 굳이 ArrayList를 생성해 메모리 할당할 필요 없이 배열 자체를 for문을 돌려 푸는 게 더 낫다는 반응이 많았다. 두 코드의 결과를 보면 속도적인 측면에서는 비슷비슷한 것 같지만 메모리 공간을 생각하면 확실히 그냥 for문으로만 풀어도 충분한 것 같다.

댓글남기기