코딩테스트 2일차. 헷갈렸던 문제를 정리하고 어제 메모해 뒀던 String에 대한 정리를 하겠다.
String str = "Hello";
str = str + " World"; "hello world"
String : 불변. 위의 str에서 기존의 str 메모리 영역에 world가 추가되는 방식으로
저장되는게 아니라 world를 붙이는 순간 Hello world는 새로운 메모리영역에
저장이 되고 처음 선언했던 hello 값이 할당 되었던 메모리영역은
Garbage로 남아있다가 GC(garbage collection)에 의해 사라진다.
참고로 String도 불변성을 가지므로 멀티쓰레드 환경에서 안전하다(thread-safe).
String은 문자열을 수정하면 새로운 String 인스턴스가 생성된다.
StringBuffuer, StringBuilder : 가변성. .append() .delete() 등의 api를 이용해 동일 객체내에서 문자열을 바꾸는게 가능하다.
문자열의 추가 수정 삭제가 빈번하게 발생할 경우 사용하면 좋다.
StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다(thread-safe).
StringBuilder는 단일쓰레드이거나 동기화를 고려하지 않아도 될 경우 사용한다.
활용 정리
String : 문자열 연산이 적고 멀티쓰레드 환경일 때
StringBuffer : 문자열 연산이 많고 멀티쓰레드 환경일 때
StringBuilder: 문자열 연산이 많고 단일쓰레드 환경이나 동기화를 고려하지 않아도 될 때.
문제
배열 2개를 비교해서 없는 String 값 반환하는 문제.
시도
새로운 배열 1개를 기록지로 만들어서 겹치지 않는 0의 값을 가진 String 반환 시도
동명이인 문제로 실패
새로운 배열 하나를 더 만들어 비교 한 값도 카운팅해서 중복문제 회피 시도
동명이인 문제 해결한 듯 보였으나 정확성 반타작 효율성 실패
String answer = "";
int[] test = new int[participant.length];
int[] test2 = new int[completion.length];
for (int i = 0; i < participant.length; i++) {
for (int j = 0; j < completion.length; j++) {
if(test2[j] !=0){
continue;
}
if(participant[i].equals(completion[j])){
test[i] += 1;
test2[j] += 1;
}
}
}
for (int i = 0; i < test.length; i++) {
if(test[i] == 0){
answer = participant[i];
}
}
return answer;
3.아예 다 갈아엎고 처음부터 시작했다.
배열 추가로 더 까는건 비효율적이다.
sort로 오름차순 정렬 해서 매칭이 안되는 부분이 답이라고 생각하고 코드를 짜봤다.
그런데 배열 2개가 length가 안 맞아 새로 배열을 파서 카피를 시켜줬다.
String answer = "";
Arrays.sort(participant);
Arrays.sort(completion);
String[] copy = new String[participant.length];
copy = Arrays.copyOf(completion,participant.length);
for (int i = 0; i < participant.length; i++) {
if (!(participant[i].equals(copy[i]))){
answer = participant[i];
break;
}
}
return answer;