알고리즘/프로그래머스

수박수박수박수박수박수?(JAVA)

mrban 2022. 1. 18. 00:07

1. 문제

n을 매개변수로 받아 길이가 n인 "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수를 만드시오. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴한다.

 

2. 제한
n은 길이 10,000이하인 자연수입니다.

 

3. 정답
import java.util.ArrayList;

class Solution {
    public String solution(int n) {
        String answer = "";

        if (n % 2 ==0) {
            for (int i = 0; i < (n / 2); i++) {
                answer += "수박";
            }
        }
        else {
            for (int i = 0; i < (n / 2); i++) {
                answer += "수박";
            }
            answer += "수";
        }
        return answer;
    }
}

4. 설명

4-1. 입력받은 길이 n이 짝수개라면 "수박"으로 끝날 것이고 홀수라면 "수박" + "수"로 끝날 것이다. 따라서 짝수라면 "수박"을 answer에 n/2번 붙였고, 홀수라면 n/2번 붙인 뒤에 마지막에 "수"를 붙여 answer값을 만든다.

4-2. answer 값을 return한다.

 

5. 참고

5-1. 코드는 간단한 대신 속도가 느리다. 특히, String 값을 계속 바꿔주고 있기 때문에 이는 힙영역의 string pool에 끊임없이 문자열들이 추가된다는 것을 의미한다. 이는 메모리 낭비로 비효율적인 코드가 된다. 뭔가 대안점이 있으면 좋겠는데 지금은 보이지 않아 조금 답답하다.

 

5-2. 해결책을 찾았다. StringBuilder라는 클래스를 사용하여 문자열을 만들면 된다. StringBuilder를 통해 문자열에 메모리를 할당할 경우 String과는 다르게 값을 바꿨을때 계속해서 새로운 메모리를 사용하는 것이 아니라 기존에 존재하던 메모리 공간에 있는 데이터에 더해가는 식으로 작동하여 메모리 공간 낭비를 막을 수 있다.

import java.util.ArrayList;

class Solution {
    public String solution(int n) {
        StringBuilder answer = new StringBuilder();

        for (int i = 0; i < (n / 2); i++) {
            answer.append("수박");
        }
        if (n % 2 != 0) {
            answer.append("수");
        }
        return answer.toString();
    }
}

5-3. 참고로 "수박"을 n/2번 붙여주는 것은 어떤 경우라도 반드시 그러하기 떄문에 굳이 n의 길이가 짝수일때랑 홀수일 때를 구분하여 for문을 돌릴 필요가 없어서 코드를 더 깔끔하게 줄였다.