코딩테스트 준비

Zoonmy·2023년 11월 1일

1) Comparator 공부하기

[Softeer Lv2 - 금고털이] 를 공부하며 배웠던 Collection.sort관련 메소드 정리이다.

List<int[]> jewel_list = new ArrayList<>();

for(int i=0; i<N; i++){
	jewel_list.add(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())});
}

Collections.sort(jewel_list, (o1, o2) -> o2[1] - o1[1]);

jewel_list의 List에 대해 (o1, o2)두 개의 요소를 가져와서 -> o2[1]이 크면 true, o1[1]이 크면 false ! --> 즉, o2[1]이 크면 앞으로, o1[1]이 크면 앞으로

list는 정렬하려는 리스트입니다.
(o1, o2) -> o2[1] - o1[1] 부분은 Comparator를 정의합니다. 이 Comparator는 두 요소를 비교하여 어떤 요소가 앞에 올지 정의합니다.
o1 및 o2는 비교할 두 요소입니다. 이 코드는 두 요소의 두 번째 원소로 비교를 수행합니다.
o2[1] - o1[1]은 비교 로직입니다. 이것은 두 번째 원소(인덱스 1)를 기준으로 두 요소를 비교합니다.
o2[1] - o1[1]은 두 번째 원소(o2[1])에서 두 번째 원소(o1[1])를 뺀 값을 반환합니다.
반환 값이 양수라면, o2[1]가 o1[1]보다 크므로 o2가 o1보다 우선순위가 높다는 의미입니다. 따라서 o2가 앞에 위치하게 됩니다.
반환 값이 음수라면, o1[1]이 o2[1]보다 크므로 o1이 o2보다 우선순위가 높다는 의미입니다. 따라서 o1이 앞에 위치하게 됩니다.

2) 자료형 잘 확인하기

[Softeer Lv2 - 바이러스] 를 공부하며 오류가 났던 것 정리


위 제약 조건을 만족하기 위해, K(바이러스) 수를 int 형으로 선언하였다.
하지만, long 형의 자료형을 사용해주어야 % 1000000007 하기 전의 곱셈 값을 표현할 수 있었다.
자료형에 유의하자!

3) Arrays, List - 비교

[Softeer Lv2 - 8단변속기] 를 공부하며 알았던 내용 정리

Arrays.equals(list1, list2)는 boolean값으로 return 하며
1) 동일한 요소를 갖는 지
2) 같은 순서로 포함하고 있는 지 확인

list1.equals(list2) 역시 boolean 값이며, str.equals와 동일하게 동작한다.
1) 동일한 요소를 같은 순서로 가지고 있는 지 확인

그렇다면, 요소의 값만 같은 지 확인하고 싶을 경우에는

1) list1, list를 Arrays.sort로 sorting한다.
2) 그 후에, Arrays.equals(list1, list2)를 한다.

4) String 값에서, Character.getNumericValue() 사용

[Softeer Lv2 - 장애물 인식 프로그램] 을 공부하며 알았던 내용 정리

1) input_str 값이 : 10010001일 때, str값의 각 자리에 대해 int형으로 바꿔주고자한다면

input_str = "10010001";

for(int i=0; i<N; i++){
	num_list[i] = Character.getNumericValue(input_str.charAt(i))	

를 통해 str 각각의 값을 charAt으로 char형으로 불러온 후,
Character.getNumericValue()를 통해 int형 값으로 변환해준다.

2) DFS, BFS 알고리즘에 대해 더 공부하자

DFS : [Depth-First-Search] 깊이 우선 탐색 --> 경로의 특징을 저장
BFS : [Breadth-First-Search] 넓이 우선 탐색 --> 최단 경로 탐색

이번 문제를 풀면서, 처음으로 DFS를 활용하여 코딩을 해보았다. 자세히 알기!
Queue는 add로 넣고 poll로 뺀다.

while(queue.isEmpty()){
	System.out.println(queue.poll());
	}

DFS 알고리즘을 활용할 때는, 제약조건을 잘 활용하기, 재귀함수를 잘 할용하기

  • 재귀함수 : dfs(x,y)와 같은 식으로 계속 돌고돌기
  • 제약 조건 : int[] dx, int[] dy를 이용하여 for 루프를 동서남북으로 돌면서 x>=0, x<N, y>=0, y<N인지를 확인하고 visited boolean 배열을 선언하여 true, false를 확인하며 진행하기

결론적으로. 처음으로 dfs 활용 문제를 풀어보았다. 처음에는 어렵다고 생각되어 풀기 싫었는데, 막상 풀고나니 별 거 없었다(?). 그리고 static 변수를 잘 써서, 매개변수를 줄여주는 것도 좋은 습관이 될 것 같다

5) StringTokenizer 주의

[Softeer Lv2 - GBC] 을 공부하며 알았던 내용 정리
문제에서, 공백을 기준으로 한 입력 예시가 많이 나왔다.
따라서, 항상 쓰던 BufferedReader와 StringTokenizer를 혼합하여 사용해보기로 하였는데, 계속 0이 아닌 리턴값 오류가 떴다.

	  BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      StringTokenizer st = new StringTokenizer(br.readLine());
      
      int N = Integer.parseInt(st.nextToken());
      int M = Integer.parseInt(st.nextToken());

      for(int i=0; i<N; i++){
        int meter = Integer.parseInt(st.nextToken());
        int speed = Integer.parseInt(st.nextToken());
      }

결과적으로는, StringTokenizer를 한 번만 사용하여 입력을 처리하여 오류가 났다. 이로 인해, 입력에서 토큰이 누락되어 인덱스를 넘어가는 'NoSuchElementException'이 발생했다.

Sol ) 입력을 반복문 안에서 처리하기
for (int i = 0; i < N; i++) {
        StringTokenizer inputTokenizer = new StringTokenizer(br.readLine());
        int meter = Integer.parseInt(inputTokenizer.nextToken());
        int speed = Integer.parseInt(inputTokenizer.nextToken());
    }

6) 정리해야 할 것

- char to str, char to int

- int to str, int to char

- str to int, str to char

 
profile
열시미 해야쥐

0개의 댓글