[프로그래머스] 수박수박수박수박수박수?

박채은·2023년 4월 18일
0

코딩테스트

목록 보기
21/52

문제

  • 입력받은 n 만큼의 문자열을 리턴하는 함수를 구현하는 문제이다.
  • 패턴은 "수박수박..."

문제 풀이

class Solution {
    public String solution(int n) {
        String result = "";
        int k=0;
        for(int i=0;i< n/2;i++){
            result += "수박";
            k++;
        }
        if(n- 2*k == 1){
            result+="수";
        }
        return result;
    }
}
  • 리턴할 문자열은 홀수면 "수"로 끝나고, 짝수면 "박"으로 끝난다. 따라서 n이 홀수인 경우, 짝수인 경우로 나누어서 생각했다.
  • 나는 for문의 반복 횟수를 줄이기 위해서 n/2까지만 돌고 "수박"을 한번에 추가하도록 하였다.
  • 그리고 마지막에 "수"를 붙여야 되는지 체크해줬다.

다른 사람의 풀이

이번 문제는 푸는 것은 쉬웠지만, 다른 사람의 풀이를 보면서 "이렇게도 풀 수 있겠구나!"라는 생각이 많이 들었다.

1. substring() 사용

class Solution {
    String text =
        "수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박수박...";
  public String solution(int n) {
      String answer = text.substring(0, n);
      return answer;
  }
}
  • 여기에 적어둔 코드는 text 변수가 너무 길어서 줄여둔 상태이다.

2. 삼항 연산자 사용

class Solution {
    public String solution(int n) {
        String result = "";
        for(int i=0;i< n;i++){
            result += (i%2==0)? "수" : "박";
        }
        return result;
    }
}

3. StringBuffer 사용

class Solution {
    public String solution(int n) {
        StringBuffer sf = new StringBuffer();
        for(int i=1; i<=n;i++){
            sf.append(i%2==1?"수":"박"); 
        }
        return sf.toString();   
    }
}

  • 이번 문제에서 StringBuffer를 사용해보니, 정말 속도 차이가 체감되었다. 2번과 방법은 동일하지만, StringBuffer의 사용유무로 인해서 속도차이가 50배(테스트 15)까지도 난다.

💡 문자열을 추가하거나 변경하는 작업이 많은 경우에는 String 대신에 StringBuffer를 꼭 쓰자!
단순히 읽는 조회 연산에서는 String 객체를 사용하는 것이 더 빠를 수 있다.


4. replace() + substring() 사용

class Solution {
    public String solution(int n) {
        return new String(new char [n/2+1]).replace("\0", "수박").substring(0,n);
    }
}
  • new String(new char [n/2+1]): String 생성자에 인자로 char 배열이 들어갈 수 있다는 것을 새롭게 알았다. n/2 +1 개의 배열을 생성하면 배열이 "\0"로 초기화된다.
  • 한 칸당 "수박"으로 replace하고, substring을 하는 이유는 n이 5인 경우에 "수박수박수박"에서 "수박수박수"만 잘라야하기 때문에


새롭게 알게 된 내용

StringBuffer vs StringBuilder

코딩테스트에서는 StringBuffer와 StringBuilder 중에 어떤 것을 사용해야 할지가 궁금해졌다.

StringBuffer와 StringBuilder의 메서드 사용 방법은 동일하다. 둘의 차이점은 멀티쓰레드에서 안전하냐 안 하냐의 차이라고 한다.

  • StringBuffer
    • 동기화를 지원하여, 멀티 쓰레드에서 안전함(현업에서 사용)
    • 속도면에서 StringBuilder보다 느리다.
  • StringBuilder
    • 동기화를 지원하지 않아, 멀티 쓰레드에서 안전하지 않음
    • 속도면에서 StringBuffer보다 빠르다.

✔️ 현업에서는 StringBuffer를 사용하고, 코테에서는 StringBuilder를 사용하면 된다!(사실 성능 차이는 미미하기 때문에 StringBuffer를 사용해도 무관하다.)

[참고]
String / StringBuffer / StringBuilder

0개의 댓글