이렇게 구현된 코드는 직접 루프를 돌며 p와 y의 개수를 세는 것보다 비효율적이라고 생각할 수 있습니다. 직접 반복문을 구현한 코드는 한 번의 순회로 끝나지만, 이렇게 내장 메서드를 사용하면 toLowerCase()와 replace() 메서드에서 전체 순회가 발생하기 때문입니다. 이 메서드들을 여러 번 호출하는 만큼 전체 순회 횟수가 많아져 실행 시간이 늘어납니다.
하지만 시간 복잡도 측면에서 생각해보면 다른 결과가 나옵니다. 문자열 길이를 n이라고 했을 때 직접 순회하면 문자열 전체를 한 번 순회하는 데 소요되는 시간 복잡도인 O(n)이 소요됩니다. 이번에 작성한 자바 내장 라이브러리를 이용하면 toLowerCase()와 replace() 메서드가 각각 O(n)이 소요되지만, 시간 복잡도는 비례 관례를 나타내기 때문에 O(n) + O(n) + O(n) = O(n)이 됩니다.
즉, 시간 복잡도는 두 방법이 모두 동일합니다. 이는 물론 세 번 순회하는 내장 라이브러리를 이용한 코드가 직접 순회하는 코드보다 느릴 수는 있지만, 충분히 효율적이라는 의미입니다. 코딩 테스트는 시간 싸움이기 때문에 시간 복잡도가 같다면 최대한 간단하고 실수할 확률이 적으며, 빠르게 작성할 수 있는 방법을 선택하는 것이 좋습니다.
전체 코드
4장/문자열내_py_개수.java
public class Solution {
boolean solution(String s) {
s = s.toLowerCase();
int ps = s.length() - s.replace("p", "").length();
int ys = s.length() - s.replace("y", "").length();
return ps == ys;
}
}