🤔 문제 풀이
size라는 변수를 정의해두고 '(' 가 등장하면 size + 1, ')' 가 등장하면 size -1 을 하게 했다.
그리고 매번 size를 검사하여 만약 size가 0보다 작은 경우 즉시 false를 리턴,
또한 마지막에 size를 다시 한번 검사하여 size != 0인 경우 false를 리턴하도록 했다.
여기까진 문제가 없으나 괄호가 담긴 문자열을 순회하기위해 문자열.split("")을 사용하여
괄호 문자열을 String 배열로 변환했고 String 배열에 인덱스로 접근하여 각 인덱스별 문자에
접근했다. 하지만 효율성에서 시간초과 발생..
👻 문제점 & 원인
원인은 역시 split을 이용해 String 배열로 변환한 뒤 사용한 것,
문자열에 charAt()을 이용해 바로 접근하거나 문자열.toCharArray() 를 사용하여 char배열로 접근하니
효율성 문제가 해결되었다.
이는 split을 이용할 경우 배열화 하고자 하는 문자열의 길이만큼의 크기가 필요해지며
이때 String [] 배열을 생성하고 초기화하는데 시간이 걸리게 된다. 이 시간은 문자열의 길이만큼
늘어난다. 또한 split 메서드로 전달되는 regex 파라미터로 매번 문자열을 검사하여 분리하기 때문에
더욱 시간이 오래걸리는 것이다.
toCharArray도 배열로 변환하는 것은 마찬가지 아니냐고 할 수 있는데 아무래도 regex검사 없이
문자열의 각 요소를 바로바로 문자로 가져와 배열에 담기 때문에 시간적인 측면에서 효율적인듯하다.
효율성은 charAt > toCharArray >>>>>>>> split 인 것 같다.
✅깨달음
코테에서는 아무래도 시간 복잡도를 줄이면 줄일 수록 이득이기 때문에 문자열의 각 요소에 접근할 땐
charAt을 사용하도록 해야겠다.
🚨CODE
import java.util.*;
class Solution {
boolean solution(String s) {
boolean answer = true;
int size = 0;
for(int i = 0; i<s.length(); i++){
if(s.charAt(i) == '('){
size++;
}else{
size--;
}
if(size < 0)
return false;
}
if(size != 0)
return false;
return answer;
}
}
'코딩테스트' 카테고리의 다른 글
[JAVA-D3] SWEA 3431 - 준환이의 운동관리 (0) | 2024.05.01 |
---|---|
[JAVA-D3] SWEA 1221 - GNS (1) | 2024.05.01 |
[JAVA-D3] SWEA 1873 - 상호의 배틀필드 (0) | 2024.04.25 |
[JAVA-D3] SWEA 6808 - 규영이와 인영이의 카드게임 (0) | 2024.04.24 |
[JAVA-D3] SWEA 1493 - 수의 새로운 연산 (0) | 2024.04.24 |