4 분 소요


기본 개념

1.상수와 리터럴:

// 다음 코드의 출력 결과는 무엇인가?
public class Main {
    public static void main(String[] args) {
        final int x = 10;
        x = 20;
        System.out.println(x);
    }
}

정답: 컴파일 오류

풀이: x는 final로 선언되어 값을 변경할 수 없습니다. 따라서 x = 20;에서 컴파일 오류가 발생합니다.

2.메서드 오버로딩:

// 두 메서드가 오버로딩되는 코드를 작성하시오.
public class Main {
    public int add(int a, int b) {
        return a + b;
    }

    public double add(double a, double b) {
        return a + b;
    }

    public static void main(String[] args) {
        Main main = new Main();
        System.out.println(main.add(5, 3));       // 정수 덧셈
        System.out.println(main.add(5.0, 3.0));   // 실수 덧셈
    }
}

풀이: 메서드 이름은 같지만 매개변수의 타입이 다르면 메서드 오버로딩이 됩니다. add(int a, int b)와 add(double a, double b)는 오버로딩된 메서드입니다.

3.추상 클래스:

// 추상 클래스를 정의하고 이를 상속하는 클래스를 작성하시오.
abstract class Shape {
    abstract double area();
}

class Circle extends Shape {
    double radius;
    Circle(double radius) {
        this.radius = radius;
    }

    @Override
    double area() {
        return Math.PI * radius * radius;
    }
}

public class Main {
    public static void main(String[] args) {
        Circle circle = new Circle(5.0);
        System.out.println(circle.area());
    }
}

풀이: Shape 추상 클래스와 이를 상속하는 Circle 클래스에서 area 메서드를 구현합니다.

4.인터페이스 상속:

// 다음 인터페이스를 상속하는 클래스를 작성하시오.
interface Printable {
    void print();
}

class Document implements Printable {
    @Override
    public void print() {
        System.out.println("Document is printing");
    }
}

public class Main {
    public static void main(String[] args) {
        Document doc = new Document();
        doc.print();
    }
}

풀이: Printable 인터페이스를 구현한 Document 클래스에서 print 메서드를 구현합니다.

5.스레드:

// 두 개의 스레드를 생성하여 각각 "Thread 1"과 "Thread 2"를 출력하는 코드를 작성하시오.
class MyThread extends Thread {
    private String name;
    MyThread(String name) {
        this.name = name;
    }

    public void run() {
        System.out.println(name);
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread t1 = new MyThread("Thread 1");
        MyThread t2 = new MyThread("Thread 2");
        t1.start();
        t2.start();
    }
}

풀이: MyThread 클래스를 Thread 클래스를 상속하여 생성하고, run 메서드를 오버라이드하여 스레드에서 실행될 코드를 작성합니다.

데이터베이스 (DB)

1.INNER JOIN:

-- Employees 테이블과 Departments 테이블을 INNER JOIN하여 직원의 이름과 부서 이름을 조회하시오.
SELECT Employees.name, Departments.department_name
FROM Employees
INNER JOIN Departments ON Employees.department_id = Departments.id;

풀이: INNER JOIN을 사용하여 Employees와 Departments 테이블을 연결하고 필요한 열을 조회합니다.

2.LEFT JOIN:

-- Employees 테이블과 Departments 테이블을 LEFT JOIN하여 모든 직원과 해당 부서 이름을 조회하시오. 부서가 없는 직원도 포함합니다.
SELECT Employees.name, Departments.department_name
FROM Employees
LEFT JOIN Departments ON Employees.department_id = Departments.id;

풀이: LEFT JOIN을 사용하여 Employees 테이블의 모든 행과 일치하는 Departments 테이블의 행을 조회합니다. 부서가 없는 직원도 포함됩니다.

3.그룹화와 집계 함수

-- Employees 테이블에서 부서별 최대 급여를 조회하시오.
SELECT department, MAX(salary) as max_salary
FROM Employees
GROUP BY department;

풀이: GROUP BY와 MAX 함수를 사용하여 각 부서별 최대 급여를 계산합니다.

4.HAVING 절:

-- Employees 테이블에서 직원이 2명 이상인 부서의 평균 급여를 조회하시오.
SELECT department, AVG(salary) as avg_salary
FROM Employees
GROUP BY department
HAVING COUNT(*) >= 2;

풀이: HAVING 절을 사용하여 직원이 2명 이상인 부서만 필터링하여 평균 급여를 계산합니다.

5.서브쿼리와 IN 연산자:

-- 급여가 부서 평균 급여보다 높은 직원의 이름과 급여를 조회하시오.
SELECT name, salary
FROM Employees
WHERE salary > (
    SELECT AVG(salary)
    FROM Employees AS e2
    WHERE e2.department = Employees.department
);

풀이: 서브쿼리를 사용하여 부서별 평균 급여를 계산하고, 이를 이용하여 급여가 부서 평균 급여보다 높은 직원들을 조회합니다.

알고리즘

1.팰린드롬 검사:

// 주어진 문자열이 팰린드롬인지 확인하는 함수를 작성하시오.
public boolean isPalindrome(String s) {
    int left = 0, right = s.length() - 1;
    while (left < right) {
        if (s.charAt(left) != s.charAt(right)) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}

풀이: 문자열의 시작과 끝에서부터 문자를 비교하여 팰린드롬 여부를 확인합니다.

2.두 배열의 교집합:

// 두 배열의 교집합을 반환하는 함수를 작성하시오.
public int[] intersection(int[] nums1, int[] nums2) {
    Set<Integer> set1 = new HashSet<>();
    for (int num : nums1) {
        set1.add(num);
    }
    Set<Integer> intersection = new HashSet<>();
    for (int num : nums2) {
        if (set1.contains(num)) {
            intersection.add(num);
        }
    }
    int[] result = new int[intersection.size()];
    int i = 0;
    for (int num : intersection) {
        result[i++] = num;
    }
    return result;
}

풀이: 두 배열의 요소를 집합으로 변환하여 교집합을 구하고, 이를 배열로 반환합니다.

3.행렬의 회전:

// 주어진 NxN 행렬을 시계방향으로 90도 회전하는 함수를 작성하시오.
public void rotate(int[][] matrix) {
    int n = matrix.length;
    for (int i = 0; i < n / 2; i++) {
        for (int j = i; j < n - i - 1; j++) {
            int temp = matrix[i][j];
            matrix[i][j] = matrix[n - j - 1][i];
            matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
            matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
            matrix[j][n - i - 1] = temp;
        }
    }
}

풀이: 네 개의 값을 교환하여 행렬을 시계방향으로 90도 회전시킵니다.

4.중복 문자 제거:

// 주어진 문자열에서 중복 문자를 제거하고, 각 문자가 처음 등장하는 순서대로 나열하는 함수를 작성하시오.
public String removeDuplicates(String s) {
    Set<Character> seen = new HashSet<>();
    StringBuilder sb = new StringBuilder();
    for (char c : s.toCharArray()) {
        if (!seen.contains(c)) {
            seen.add(c);
            sb.append(c);
        }
    }
  }

풀이: 집합을 사용하여 중복 문자를 필터링하고, 처음 등장하는 순서대로 문자열을 작성합니다.

5.올바른 괄호:

// 주어진 문자열이 올바른 괄호 문자열인지 확인하는 함수를 작성하시오.
public boolean isValid(String s) {
    Stack<Character> stack = new Stack<>();
    for (char c : s.toCharArray()) {
        if (c == '(') {
            stack.push(c);
        } else if (c == ')') {
            if (stack.isEmpty() || stack.pop() != '(') {
                return false;
            }
        }
    }
    return stack.isEmpty();
}

풀이: 스택을 사용하여 괄호의 짝을 확인하고, 올바른 괄호 문자열인지 검사합니다.

댓글남기기