코딩 테스트/프로그래머스

프로그래머스 - 서울에서 김서방 찾기 (자바)

https://programmers.co.kr/learn/courses/30/lessons/12919

 

코딩테스트 연습 - 서울에서 김서방 찾기

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

programmers.co.kr

굉장히 쉬운 코드인데 글을 쓰게 된 이유는 문자열을 다루는데 기억해야하는게 있어서 입니다.

 

1. 문자열을 +로 붙히기

class Solution {
    public String solution(String[] seoul) {
        int kimIdx = getTargetNameIdx(seoul,"Kim");
        return "김서방은 " + kimIdx + "에 있다";
    }

    int getTargetNameIdx(String[] names, String targetName) {
        int idx = 0;
        for (String name : names) {
            if (name.equals(targetName)) {
                return idx;
            }
            idx++;
        }
        return -1;
    }
}

 

2. String.format 사용

class Solution {
    public String solution(String[] seoul) {
        int kimIdx = getTargetNameIdx(seoul,"Kim");
        return String.format("김서방은 %d에 있다", kimIdx);
    }

    int getTargetNameIdx(String[] names, String targetName) {
        int idx = 0;
        for (String name : names) {
            if (name.equals(targetName)) {
                return idx;
            }
            idx++;
        }
        return -1;
    }
}

 

3. StringBuilder 사용

class Solution {
    public String solution(String[] seoul) {
        int kimIdx = getTargetNameIdx(seoul,"Kim");
        StringBuilder sb = new StringBuilder();
        sb.append("김서방은 ");
        sb.append(kimIdx);
        sb.append("에 있다");
        return sb.toString();
    }

    int getTargetNameIdx(String[] names, String targetName) {
        int idx = 0;
        for (String name : names) {
            if (name.equals(targetName)) {
                return idx;
            }
            idx++;
        }
        return -1;
    }
}

4. StringBuffer 사용

- 동기화 처리로 인해 StringBuilder 보다 늦음

class Solution {
    public String solution(String[] seoul) {
        int kimIdx = getTargetNameIdx(seoul,"Kim");
        return new StringBuffer().append("김서방은 ").append(kimIdx).append("에 있다").toString();
    }

    int getTargetNameIdx(String[] names, String targetName) {
        int idx = 0;
        for (String name : names) {
            if (name.equals(targetName)) {
                return idx;
            }
            idx++;
        }
        return -1;
    }
}

3 경우를 보면 StringBuilder가 시간적인 측면에서 압도적인대 IDE에서는 StringBuilder를 String으로 변경가능하다고 표시해줍니다. 그럼 이는 String은 불변 인대 반해 StringBuffer, StringBuilder 는 가변 객체라는 문제가 있습니다. 심지어 StringBuilder 는 동기화 되어 있지않아서 멀티 쓰레드 환경에서 쓰레드 세이프 하지않기도 하죠. 

 

사용 추천

String                :  문자열 연산이 적고 멀티쓰레드 환경일 경우

StringBuffer     :  문자열 연산이 많고 멀티쓰레드 환경일 경우

StringBuilder   :  문자열 연산이 많고 단일쓰레드이거나 동기화를 고려하지 않아도 되는 경우  

한가지 더 기억할 것이 위의 표를 보면 String은 String pool 이라는 곳에 등록되어 동일한 String을 생성해도 메모리를 더 잡아먹지 않는 반면 나머지 두개는 만들때마다 메모리에 할당하게 됩니다.