표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다. 자바 프로그래머라면 적어도 java.lang, java.util, java.io 와 그 하위 패키지들에는 익숙해져야 한다.

 

핵심정리 : 바퀴를 다시 발명하지 말자. 아주 특별한 나만의 기능이 아니라면 누군가 이미 라이브러리 형태로 구현해놓았을 가능성이 크다. 그런 라이브러리가 있다면, 쓰면 된다. 있는지 잘 모르겠다면 찾아보라. 일반적으로 라이브러리의 코드는 여러분이 직접 작성한 것보다 품질이 좋고, 점차 개선될 가능성이 크다. 여러분의 실력을 폄하하는 게 아니다. 코드 품질에도 규모의 경제가 적용된다. 즉, 라이브러리 코드는 개발자 각자가 작성하는 것보다 주목을 훨씬 많이 받으므로 코드 품질도 그만큼 높아진다.

for-each문을 사용할 경우 가독성이 향상, 오류 감소, 유지보수가 용이해진다.

 

for-each문을 사용할 수 없는 경우가 있다.

  • 선택된 원소를 제거해야 할 때
  • 원소의 일부 혹은 전체를 수정해야 할 때
  • 여러 컬렉션을 병렬로 순회해야 할 때

위 경우에는 전통적인 for문을 사용하는게 낫다.

 

핵심 정리 : 전통적인 for 문과 비교했을 때 for-each 문은 명료하고, 유연하고, 버그를 예방해준다. 성능 저하도 없다. 가능한 모든 곳에서 for문이 아닌 for-each 문을 사용하자.

지역변수의 범위를 최소화하는 것은 코드의 가독성을 높이고, 유지보수를 쉽게 하며, 오류를 줄이는 데 도움이 된다.

 

지역변수의 범위를 최소화 하는 방법 : 

  • 가장 처음 쓰일 때 선언하기
  • 그리고 모든 지역변수는 선언과 동시에 초기화해야 한다.
  • 메서드를 작게 유지하고 한 가지 기능에 집중하기.

[문제 링크]

https://www.acmicpc.net/problem/19637

[난이도]

- Silver 3

 

[알고리즘]

- 이분탐색

 

[코드]

import java.io.*;
import java.util.*;

public class Main {
    static int N, M;
    static int[] power;
    static String[] title;
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        power = new int[N];
        title = new String[N];

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            title[i] = st.nextToken();
            power[i] = Integer.parseInt(st.nextToken());
        }
        for (int i = 0; i < M; i++) {
            int key = Integer.parseInt(br.readLine());
            binarySearch(key);
        }
        System.out.println(sb);
    }

    static void binarySearch(int key) {
        int left = 0;
        int right = N;
        int index = 0;
        while (left <= right) {
            int mid = (left + right) / 2;
            if (key <= power[mid]) {
                right = mid - 1;
                index = mid;
            } else if (key > power[mid]) {
                left = mid + 1;
            }
        }
        sb.append(title[index]).append("\n");
    }
}

[풀이]

찾으려는 key 값이 mid보다 작거나 같을 때마다 index를 갱신해준다. 그리고 while문이 끝났을 경우 갱신해왔던 index를 형식에 맞게 출력해준다.

'코딩테스트' 카테고리의 다른 글

백준 9655: 돌 게임 [JAVA]  (0) 2024.05.30
백준 1010: 다리 놓기 [JAVA]  (0) 2024.05.29
백준 4158: CD [JAVA]  (0) 2024.05.23
백준 2417: 정수 제곱근 [JAVA]  (0) 2024.05.21
백준 1654: 랜선 자르기 [JAVA]  (0) 2024.05.21

[문제 링크]

https://www.acmicpc.net/problem/4158

[난이도]

- Silver 5

 

[알고리즘]

- 이분탐색

 

[코드]

import java.io.*;
import java.util.*;

public class Main {
    static int N, M, answer;
    static int[] arr;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        while (true) {
            st = new StringTokenizer(br.readLine(), " ");
            N = Integer.parseInt(st.nextToken());
            M = Integer.parseInt(st.nextToken());

            if (N == 0 && M == 0) break;

            arr = new int[N];
            answer = 0;

            for (int i = 0; i < N; i++) {
                arr[i] = Integer.parseInt(br.readLine());
            }

            for (int i = 0; i < M; i++) {
                int key = Integer.parseInt(br.readLine());
                if (binarySearch(key)) {
                    answer++;
                }
            }

            System.out.println(answer);
        }

        br.close();
    }

    static boolean binarySearch(int key) {
        int left = 0;
        int right = arr.length - 1;

        while (left <= right) {
            int mid = (left + right) / 2;

            if (key == arr[mid]) {
                return true;
            } else if (key < arr[mid]) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return false;
    }
}

[풀이]

가장 기본적인 이분탐색 코드이다.

key 값을 찾을 때마다 answer++를 한 후 출력해준다.

+ Recent posts