230216 TIL #10 코딩테스트 완주하지못한선수

김춘복·2023년 2월 15일
0

TIL : Today I Learned

목록 보기
10/571

230216 Today I Learned

코딩테스트 2일차. 헷갈렸던 문제를 정리하고 어제 메모해 뒀던 String에 대한 정리를 하겠다.


String, StringBuffuer, StringBuilder 정리

  • 연산이 많지 않을때는 차이가 없다.
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. 새로운 배열 1개를 기록지로 만들어서 겹치지 않는 0의 값을 가진 String 반환 시도
    동명이인 문제로 실패

  2. 새로운 배열 하나를 더 만들어 비교 한 값도 카운팅해서 중복문제 회피 시도
    동명이인 문제 해결한 듯 보였으나 정확성 반타작 효율성 실패

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;
  • 알게된 것 : 알고리즘테스트는 정확성 뿐만 아니라 효율성도 같이 본다. 길고 복잡하고 시간복잡도 높은 코드는 지양할 것.
  • break; continue;의 제대로 된 활용법을 알아 둘 것.
  • 배열 복사할 때, 위의 예시처럼 뒷 값을 남겨두고 하려면 미리 크기 지정을 하고
    Arrays.copyOf(원본배열명, 복사하고싶은길이)로 선언하는데
    여기서 복사하고싶은 길이란 카피할만큼이 아니라 null로 들어오는 뒷 값까지 포함해야한다.

어제 못한 것

  • long answer = (long)x(i+1)은 되는데 (long)(x(i+1))은 안됨. 왜?
    전자는 곱하기 전에 후자는 곱하고 난 뒤에 long을 선언해주는거라
    전자의 방식이 곱하기 전에 미리 오버플로우 나는 걸 방지하는 효과가 있어 좋다.

내일 할 것

  • 컬렉션 프레임워크를 잘 써먹을 줄 모르니 코딩테스트에서 자꾸 막힌다. 내일은 코딩 잠깐 멈추고 이거부터 공부해서 정리하고 넘어가야 겠다.
profile
Backend Dev / Data Engineer

0개의 댓글