시뮬레이션
- 주어진 문제의 규칙이나 조건을 그대로 구현하여 결과를 얻는 방법이다.
- 알고리즘이라기보다는 문제 해결 방법론으로 볼 수 있다.
- 시뮬레이션을 구현하는 과정에서 효율성을 위해 특정 알고리즘이 활용될 수도 있다.
이번 문제는 코딩테스트의 느낌보다는 회사에서 주어진 과제 같은 느낌을 받았다.
단순 구현이라했지만 String API와 정규식 표현을 잘 몰랐다면 어려웠을 것 같다.
구현 1 - String
class Solution {
public String solution(String new_id) {
String answer = "";
// 1
answer = new_id.toLowerCase();
// 2
answer = answer.replaceAll("[^a-z0-9._-]", "");
// 3
answer = answer.replaceAll("[.]+", ".");
// 4
answer = answer.replaceAll("^[.]|[.]$", "");
// 5
answer = answer.isEmpty() ? "a" : answer;
// 6
if (answer.length() > 15) {
answer = answer.substring(0, 15);
answer = answer.replaceAll("[.]$", "");
}
// 7
while (answer.length() < 3) {
answer += answer.charAt(answer.length() - 1);
}
return answer;
}
}
String은 불변 객체이기 때문에 단계마다 answer가 재할당되어, 매번 새로운 문자열 객체가 생성되고 메모리를 차지하게 된다.
System.identityHashCode(answer)
identityHashCode 를 사용하여 객체 주소값을 비교해보려한다.
identityHashCode 는 객체 주소 값을 정수로 나타내는 메서드이며, 단계마다 출력해본다면 아래와 같다.
조건에 맞지 않아 실행되지 않은 코드를 제외하고, 전부 다른 주소 값을 가지고 있다.
이처럼 문자열 조작이 빈번한 경우, StringBuilder를 사용하여 구현할 수도 있다.
구현 2 - StringBuilder
StringBuilder는 내부적으로 동적 배열을 사용하는데, 초기화 시 전달된 문자열 길이에 따라 초기 크기가 설정되고,
배열이 가득 차면 더 큰 배열을 생성하여 기존 내용을 복사한다.
이 동작 덕분에 새로운 객체 생성이 줄어든다.
StringBuilder sb = new StringBuilder("Hello");
// 초기 크기: "Hello" 길이 + 여유 공간
sb.append(" World"); // 여유 공간 내에서 처리 (기존 객체 유지)
class Solution {
public String solution(String new_id) {
// 1
StringBuilder answer = new StringBuilder(new_id.toLowerCase());
// 2
for (int i = 0; i < answer.length(); i++) {
char ch = answer.charAt(i);
if (!(Character.isLowerCase(ch) || Character.isDigit(ch) || ch == '-' || ch == '_' || ch == '.')) {
answer.deleteCharAt(i);
i--;
}
}
// 3
for (int i = 1; i < answer.length(); i++) {
if (answer.charAt(i) == '.' && answer.charAt(i - 1) == '.') {
answer.deleteCharAt(i);
i--;
}
}
// 4
if (answer.length() > 0 && answer.charAt(0) == '.') {
answer.deleteCharAt(0);
}
if (answer.length() > 0 && answer.charAt(answer.length() - 1) == '.') {
answer.deleteCharAt(answer.length() - 1);
}
// 5
if (answer.length() == 0) {
answer.append("a");
}
// 6
if (answer.length() > 15) {
answer.setLength(15);
if (answer.charAt(answer.length() - 1) == '.') {
answer.deleteCharAt(answer.length() - 1);
}
}
// 7
while (answer.length() < 3) {
answer.append(answer.charAt(answer.length() - 1));
}
return answer.toString();
}
}
성능 이점이 있지만 일반 String으로 구현한 것보다 가독성이 좋지 않다.
메모리와 성능이 중요한 상황이 아니라면 일반 String으로 구현하는 방법도 좋을 것 같다.
프로그래머스 - 신규 아이디 추천
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
'코딩테스트 > 99클럽 4기' 카테고리의 다른 글
99클럽 코테 스터디 34일차 TIL (0) | 2024.11.30 |
---|---|
99클럽 코테 스터디 32일차 TIL (0) | 2024.11.28 |
99클럽 코테 스터디 31일차 TIL (0) | 2024.11.27 |
99클럽 코테 스터디 30일차 TIL (1) | 2024.11.26 |
99클럽 코테 스터디 29일차 TIL (0) | 2024.11.25 |