복's

코딩 테스트 준비하기 (without IDE) 본문

알고리즘/코딩테스트

코딩 테스트 준비하기 (without IDE)

나복이 2024. 9. 21. 00:42
728x90

[ 📌 서론 ]

코딩 테스트 몇 번 경험은 있는데, 좋은 기업인덴도 가볍게 생각하고 준비를 안했다가 특정 메소드들이 기억이 안나서 문제를 풀다가 포기한 기억이 있다.

 

그래서 Java 가 아니라 Python 으로 문제를 풀려고 공부 하다가, 결국 일할 때 사용하는 언어는 Java고, 공부할 때도 사용하니까 다시 Java 로 시험 치기로 결심 했다.

 

우서 코딩 테스트 날짜가 잡힌 만큼 내가 Java 를 IDE 없이 사용하면서 기억 안나거나 어색한 점들을 기록 하려고 한다.

프로그래머스 LV1 ~ LV2 를 풀면서 내가 


[ 📌 준비하기 - JAVA ]

1. List<Integer> 타입 int[] 로 변환

첫 문제부터 난항을 겪는다... IDE 사용할 때는 몰랐는데, 막상 없이 하려니까 진짜 답답하고, 현기증 날 것 같다.

 

🚫 내가 실수한 부분 

return answerList.stream()
                 .map(Integer::intValue)
                 .toArray();

 

만들고자 하는 반환형 타입은 int[] 타입인데, map 을 사용하게되면 반환되는 타입이 Stream<Integer> 이다.

여전히 원시형 타입을 갖는 Stream 형태이기 때문에 문제에서 요구하는 타입이 될 수 없었다.

 

✅ 수정된 답안

return answerList.stream()
                 .mapToInt(Integer::intValue)
                 .toArray();

 

원시형 타입을 다룰 수 있는 IntStream 객체를 반환하는 mapToInt() 를 사용하였다.

사실 정답으로 제출 하라고 주어진 자료구조 int[] answer 가 있었는데, 내가 지우고 list 로 변경한 점이 잘못된 점인거 같다....

answer[i] 에 인덱스를 통해서 정답을 넣는 형태가 싫어서 리스트에 순서대로 정답을 집어넣고 싶었는데, 이런 결과가 만들어졌다.


2.  HashMap 클래스 containsKey 메소드

 

진짜 충격적인 부분인데... 나는 contains() 를 호출 하면서 왜 안되지라고 한참 생각 했었다.

IDE 가 사람을 바보로 만드는 것일까? 원래 바보인가?

HashMap 구조상 <K, V> 가 당연한 것을 나는 단지 contains() 호출만 하고 있었으니 컴파일 오류가 날 수 밖에...

 

 

containsKey, containsValue 까먹지 말도록 하자 !


3. Comparator 구현

문제는 사실 도움 없이 잘 풀었는데, 내가 참고 없이 풀었다는게 신기해서 정리 한다.

sort() 를 자주 사용하다가 보니까 눈에 익었는지 어떻게 구현이 잘 된다 이제

 

나는 주로 2 개의 방법을 사용하는데, 더 있는지는 모른다...

코드를 구현하기 전에 반드시 선행되어야 하는 import

import java.util.Arrays;
import java.util.Comparator;

 

  익명 메소드 구현

Arrays.sort(ans, new Comparator<int[]>() {
    int sortCol = columnMap.get(sort_by);

    @Override
    public int compare(int[] a, int[] b) {
        return a[sortCol] - b[sortCol];
    }
});

코드 내부에 구현을 동시에 하는 방법이 있고

 

  Implement Comparable

class File implements Comparable<File> {
    String origin;
    String head;
    int num;

    public File(String origin, String head, int num) {
        this.origin = origin;
        this.head = head.toUpperCase();
        this.num = num;
    }

    @Override
    public int compareTo(File file) {
        int headRes = this.head.compareTo(file.head);

        if(headRes == 0) {
            return this.num - file.num;
        }

        return headRes;
    }
}

클래스가 인터페이스를 구현하여 메소드를 오버라이딩 하는 방법이다.

 

세세하게 신경써야 하는 점은 제네릭을 이용해서 타입을 지정해주는게 구현이 훨씬 편하다.(Object 캐스팅 하기 싫으면 필수)

그리고 Compartor 와 Comparable은 구현하는 메소드가 다르기 때문에 이 작은 차이만 인지하고 있으면 된다.

 

compare, compareTo 의 차이도 물론 알고 있으면 좋다.


[ 📌 준비하기 - ORACLE(SQL) ]

1. 데이터가 NULL 일 때 원하는 출력(NVL)

예약어가 기억이 안나서 미쳐버릴 것 같다.... ORM 만 사용했더니... 다른 DBMS 를 여러번 거쳤더니 기억이 안나서 정말 힘들다.

이때 전화번호가 없는 경우, 'NONE'으로 출력

 

제시된 문제는 위와 같았고, NVL 이 기억나지 않아서 CASE WHEN 으로 해결 가능 했지만...

CASE WHEN tlno IS NULL
     THEN 'NONE'
     ELSE tlno
 END AS tlno

 

나는 머릿속 구석에 자리잡고 있는 예약어를 사용하고 싶었다.

NVL(tlno, 'NONE') AS tlno

2. 소수점 출력할 때 0도 출력 되도록 포맷팅 하는 방법

문제 요구사항이 소수점 첫 번째 자리까지는 반드시 출력해야 하는데, 포매팅 방법을 몰라서 한참 시간을 소비했다.

SELECT TO_CHAR(30, 'FM9999.00') AS num
  FROM DUAL
;

 

이런 방식으로 해결 했는데, 출력하고자 하는 자리수의 값이 0 일 때도 표시 유무에 따라서 표현식이 달라진다.

ex)
FM9990.00
FM9999.00
FM9999.99
FM9999.00

TO_CHAR(30.000, 'FM9999.00') -> 30.00
TO_CHAR(30.00, 'FM9999.99') -> 30.
TO_CHAR(0.123, 'FM9900.00') -> 00.12

3. 별칭 맨 앞 글자 숫자 출력

SELECT mcdp_cd AS 진료과코드
     , COUNT(*) AS "5월예약건수"

"" 큰 따옴표를 이용하면 앞에 숫자를 넣은 별칭도 만들 수 있다.


[ 📌 마무리... ]

코딩 테스트 날짜가 갑자기 잡혀서 IDE 없이 벼락치기 연습 했는데, 모르는게 너무 많아서 진작 연습 했어야 했는데 하고 후회중이다...

막상 하려고 하니까 기억나는게 많아서 놀랐지만, 모르는게 더 많아서 더 놀랐다.

 

SQL 까지 본다고 해서 부랴부랴 Oracle 기준으로 문제 풀이 했는데, 요즘 ORM 도 쓰고, 다른 DBMS 만 쓰다 보니까 역시...많이 기억은 안난다.

728x90