[문제링크]
https://school.programmers.co.kr/learn/courses/30/lessons/120898
✔️요구사항
머쓱이는 할머니께 생신 축하 편지를 쓰려고 합니다. 할머니가 보시기 편하도록 글자 한 자 한 자를 가로 2cm 크기로 적으려고 하며, 편지를 가로로만 적을 때, 축하 문구 message
를 적기 위해 필요한 편지지의 최소 가로길이를 return 하도록 solution 함수를 완성해주세요.
✔️제한사항
- 공백도 하나의 문자로 취급합니다.
- 1 ≤ message의 길이 ≤ 50
- 편지지의 여백은 생각하지 않습니다.
message
는 영문 알파벳 대소문자, ‘!’, ‘~’ 또는 공백으로만 이루어져 있습니다.
✔️입출력 예
message | result |
---|---|
“happy birthday!” | 30 |
“I love you~” | 22 |
- 글자수가 15개로 최소 가로 30cm의 편지지가 필요합니다.
- 글자수가 11개로 최소 가로 22cm의 편지지가 필요합니다.
✔️나의 문제풀이
class Solution {
public int solution(String message) {
return message.length() * 2;
}
}
- String을 length()함수로 길이를 구하고 2를 곱해서 해결하였다.
테스트 | 성능 |
---|---|
테스트 1 〉 | 통과 (0.04ms, 74MB) |
테스트 2 〉 | 통과 (0.02ms, 75.1MB) |
테스트 3 〉 | 통과 (0.02ms, 73MB) |
✔️다른사람의 문제풀이
class Solution {
public int solution(String message) {
int answer = 0;
String[] ml = message.split("");
for(int i=0; i<ml.length; i++){
answer++;
}
return answer*2;
}
}
- 문자열을 split(“”)으로 각 문자 단위로 분할하여 배열에 작업하여 for문으로 문자열 길이를 더해주는 방법으로 해결하였다.
테스트 | 성능 |
---|---|
테스트 1 〉 | 통과 (0.12ms, 78.2MB) |
테스트 2 〉 | 통과 (0.23ms, 78.4MB) |
테스트 3 〉 | 통과 (0.17ms, 77MB) |
고민
-
length()매서드는 문자열의 길이를 직접 가져오는 것이므로 O(n) 시간복잡도로 작업을 수행하고 공간 복잡도가 O(1) 즉, 상수 시간이 걸린다.
-
반면, split()매서드와 for 반복문을 함께 사용하는방법도 시간복잡도는 O(n)로 같지만 공간 복잡도가 O(n)가 된다.
-
length를 사용하는 방법이 간단하며 가독성이 좋고 후자의 경우 더 복잡해지며 많은 작업을 수행하게 되어 낭비라고 생각이 들었다.
-
split은 문자열을 배열로 변환하기에 메모리를 추가적으로 사용하게 된다.
하지만length() * 2
는 추가 메모리를 필요로 하지 않아 메모리가 절약된다. -
성능상으로도 전자가 빠르다는 것을 확인할 수 있다.
'문제풀이 > 프로그래머스' 카테고리의 다른 글
Java - 배열의 유사도 (2) | 2023.10.12 |
---|---|
Java - 모음제거 (2) | 2023.10.12 |
Lv0. 순서쌍의 개수 - java (0) | 2023.10.09 |
Lv0. 삼각형의 완성조건 (1) - java (0) | 2023.10.09 |