2024-09-27 ๐ŸŽณ

์ง€๋‹ˆ๐Ÿงธยท2024๋…„ 9์›” 28์ผ
0

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
39/43

๋ฌผ๊ณ ๊ธฐ ์ข…๋ฅ˜ ๋ณ„ ๋Œ€์–ด ์ฐพ๊ธฐ [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค]

๋ฌผ๊ณ ๊ธฐ ์ข…๋ฅ˜ ๋ณ„๋กœ ๊ฐ€์žฅ ํฐ ๋ฌผ๊ณ ๊ธฐ์˜ ID(ID), ๋ฌผ๊ณ ๊ธฐ ์ด๋ฆ„(FISH_NAME), ๊ธธ์ด(LENGTH)๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL ๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

ํ…Œ์ด๋ธ”

FISH_INFO ํ…Œ์ด๋ธ”: ID, FISH_TYPE, LENGTH, TIME
FISH_NAME_INFO ํ…Œ์ด๋ธ”: FISH_TYPE, FISH_NAME

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

๋ฌผ๊ณ ๊ธฐ ์ข…๋ฅ˜ ๋ณ„๋กœ ๊ฐ€์žฅ ๊ธธ์ด๊ฐ€ ๊ธด ๊ฒƒ์„ ์ฐพ๋Š” ๊ฑฐ๋‹ˆ GROUP BY, HAVING์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊ฑฐ๋ผ ์ƒ๊ฐํ–ˆ์ง€๋งŒ, GROUP BY๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์‚ฌํ•ญ๋งŒ SELECT ๋ฌธ์— ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. GROUP BY ์ ˆ์— ๋ช…์‹œ๋œ ๊ธฐ์ค€ ์ปฌ๋Ÿผ
  2. ์ง‘๊ณ„ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋œ ์ปฌ๋Ÿผ

HAVING ์ ˆ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ œ์•ฝ์‚ฌํ•ญ์„ ๊ฐ–๋Š”๋‹ค.

  1. GROUP BY ์ ˆ์— ๋ช…์‹œ๋œ ์ปฌ๋Ÿผ๋งŒ ๋ช…์‹œ ๊ฐ€๋Šฅ
  2. ๋ฌด์กฐ๊ฑด ์ด ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด ์ง‘๊ณ„ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

๊ทธ๋ž˜์„œ ์ด์ค‘ SQL ๋ฌธ์œผ๋กœ ์งœ์•ผ๊ฒ ๊ตฌ๋‚˜ ์‹ถ์—ˆ๋‹ค.

๋ฌผ๊ณ ๊ธฐ ์ข…๋ฅ˜๋ณ„๋กœ ๊ฐ€์žฅ ๊ธด ๊ธธ์ด๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ fish_type ๋ณ„ ๊ฐ€์žฅ ๊ธด ๊ธธ์ด๋ฅผ ๋ฝ‘์€ ์ž„์‹œ ์ง‘ํ•ฉ(fish_type, length)์„ ๋งŒ๋“ค๊ณ , ์ด์™€ ์ผ์น˜ํ•˜๋Š” ํ–‰์˜ ์ •๋ณด๋ฅผ ๋ฝ‘์•˜๋‹ค.

๋‹ต

select id, fni.fish_name, length from fish_info join fish_name_info fni on fish_info.fish_type = fni.fish_type
where (fni.fish_type, length) in (
    select fish_type, max(length)
    from fish_info
    group by fish_type
)
order by id asc;

Second Highest Salary [LeetCode #176]

๋‘๋ฒˆ์งธ๋กœ ๋†’์€ ์œ ๋‹ˆํฌ salary ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด null์„ ์ถœ๋ ฅํ•œ๋‹ค

ํ…Œ์ด๋ธ”

Employee: id, salary

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

์‹ค์ œ๋กœ ๋‘๋ฒˆ์งธ๋กœ ๋†’์€ ๊ณ ์œ  salary๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด ๊ฐ’๋„ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‚˜๋Š” case ๋ฌธ์œผ๋กœ ๊ณ ์œ ํ•œ salary ๊ฐ’์ด ๋‘๊ฐœ ์ด์ƒ์ผ ๊ฒฝ์šฐ์™€ ๋‘ ๊ฐœ ๋ฏธ๋งŒ์ผ ๊ฒฝ์šฐ๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค.

select 
case
    when count(distinct salary) >= 2 then (
        select distinct salary 
        from Employee
        order by salary desc
        limit 1, 1
    )
    else null 
end as SecondHighestSalary
from Employee;

Populating Next Right Pointers in Each Node [LeetCode#117]

๊ฐ ๋…ธ๋“œ๊ฐ€ left ์ž์‹๊ณผ right ์ž์‹์„ ๊ฐ–๋Š” ํŠธ๋ฆฌ ๊ตฌ์กฐ์—์„œ ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ๋…ธ๋“œ๋“ค์„ next๋กœ ์—ฐ๊ฒฐ์‹œํ‚จ๋‹ค.

๋‚ด ํ’€์ด

BFS๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

Map<Node, Integer>๋กœ ๊ฐ ๋…ธ๋“œ์˜ ๋ ˆ๋ฒจ์„ ์ €์žฅํ•˜๊ณ , Map<Integer, List<Node>>๋กœ ๊ฐ ๋ ˆ๋ฒจ๋‹น ๋…ธ๋“œ ์ง‘ํ•ฉ์„ ์ˆœ์„œ๋ฅผ ๊ฐ–์ถฐ์„œ ๊ด€๋ฆฌํ–ˆ๋‹ค.

if (root == null) return root;
ArrayDeque<Node> queue = new ArrayDeque<>();
Map<Integer, ArrayList<Node>> distance = new HashMap<>();
Map<Node, Integer> map = new HashMap<>();

queue.addLast(root);
map.put(root, 0);

while (!queue.isEmpty()) {
    Node node = queue.pollFirst();
    int dist = map.get(node);
    if (!distance.containsKey(dist + 1)) distance.put(dist + 1, new ArrayList<Node>());
    if (node.left != null) {
        map.put(node.left, dist + 1);
        distance.get(dist + 1).add(node.left);
        queue.add(node.left);
    } 
    if (node.right != null) {
        map.put(node.right, dist + 1);
        distance.get(dist+1).add(node.right);
        queue.add(node.right);
    } 
}

BFS๋ฅผ ๋ชจ๋‘ ๋งˆ์นœ ํ›„, distance ๋งต์œผ๋กœ ๊ฐ ๋ ˆ๋ฒจ์˜ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ๋‹ค.

int dist = 1;
while (distance.containsKey(dist)) {
    List<Node> connected = distance.get(dist);
    for (int i = 0; i < connected.size()-1; i++) {
        connected.get(i).next = connected.get(i+1);
    }

    dist++;
}

์•„์‰ฌ์› ๋˜ ์ 

์งœ๊ธฐ ์‰ฌ์› ์ง€๋งŒ ์ข‹์€ ์ฝ”๋“œ๋Š” ์•„๋‹ˆ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์–ด์ฐจํ”ผ BFS๋กœ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ, ํ•œ ๋ฒˆ์˜ ํƒ์ƒ‰์œผ๋กœ ๊ฐ ๋ ˆ๋ฒจ์˜ ๋…ธ๋“œ ์—ฐ๊ฒฐ๊นŒ์ง€ ๋๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ?

๋ณด์™„ํ•œ ํ’€์ด

public Node connect(Node root) {

    if (root == null) return root;
    ArrayDeque<Node> queue = new ArrayDeque<>();
    queue.offer(root); // ๋…ธ๋“œ ๋ ˆ๋ฒจ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.


    while (!queue.isEmpty()) {

        int size = queue.size(); // queue์˜ ํฌ๊ธฐ๋Š” ๊ฐ€๋ณ€์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๋ ˆ๋ฒจ์— ์žˆ๋Š” ๋…ธ๋“œ์˜ ํƒ์ƒ‰์œผ๋กœ๋งŒ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค
        Node prev = null; // ๊ฐ ๋ ˆ๋ฒจ์„ ์ฒ˜์Œ ์‹œ์ž‘ํ•˜๋ฉด ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ๋Š” ์—†๋‹ค.

        for (int i = 0; i < size; i++) {
            Node node = queue.pollFirst();

            if (prev != null) {
                prev.next = node; // ํ˜„์žฌ ๋ ˆ๋ฒจ์˜ ์ฒซ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ ๊ฑฐ์น  ๊ณผ์ •
            }

            prev = node; // ํ˜„์žฌ ๋…ธ๋“œ๋Š” ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ด์ „ ๋…ธ๋“œ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

			// null์ด ์•„๋‹Œ ๋ชจ๋“  ์ž์‹์„ ์™ผ์ชฝ๋ถ€ํ„ฐ ํ์— ๋”ํ•ด์„œ ๋‹ค์Œ while ๋ฃจํ”„์— ํƒ์ƒ‰๋˜๋„๋ก ํ•œ๋‹ค
            if (node.left != null) {
                queue.add(node.left);
            }
            if (node.right != null) {
                queue.add(node.right);
            }
        }

    }
    return root;
}

Permutations II [LeetCode#47]

์ค‘๋ณต ์ˆซ์ž๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ง‘ํ•ฉ์— ๋Œ€ํ•˜์—ฌ ๋ชจ๋“  ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ์œ  ์ˆœ์—ด์„ ๋ชจ๋‘ ์ถœ๋ ฅํ•œ๋‹ค

๋ฌธ์ œ

์ž…๋ ฅ๊ฐ’: int[] nums
๋ฐ˜ํ™˜๊ฐ’: List<List<Integer>>

ํ•ด๊ฒฐ๋ฐฉ์•ˆ

๊ณ ์œ  ์ˆœ์—ด์ด ํ•ต์‹ฌ์ด๋‹ค.

์ž…๋ ฅ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ ๋‹ค์Œ, ํƒ์ƒ‰ ์กฐ๊ฑด์— ์ œ์•ฝ์„ ์ถ”๊ฐ€ํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ๋‹ค์Œ ํ™•์ธํ•˜๋Š” ์ž‘์—…์„ ๊ฐ„์†Œํ™”ํ•œ๋‹ค.

์ฃผ๋กœ ํƒ์ƒ‰ ์กฐ๊ฑด์€ !visited[i]๊ฐ€ ์ „๋ถ€์ด์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” ํ˜„์žฌ i๋ฒˆ์งธ ์š”์†Œ์™€ ์ด์ „ ์š”์†Œ (i-1)๊ฐ€ ๋™์ผํ•œ ๊ฐ’์ธ์ง€ ํ™•์ธํ•˜๊ณ , ๋™์ผํ•œ ๊ฐ’์ด๋ผ๋ฉด ์ด์ „ ์š”์†Œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

i-1๋ฒˆ์งธ ๊ฐ’, i๋ฒˆ์งธ ๊ฐ’ ๋ชจ๋‘ 1์ธ๋ฐ, i-1๋ฒˆ์งธ ๊ฐ’์„ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ i๋ฒˆ์งธ ๊ฐ’์„ ๋ฐฉ๋ฌธํ•˜๋ฉด, ์–ด์ฐจํ”ผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

112์™€ 112๋Š” ๊ฐ™๋‹ค.

class Solution {
    static List<List<Integer>> result;
    public List<List<Integer>> permuteUnique(int[] nums) {
        result = new ArrayList<>();
        Arrays.sort(nums);
        genPerm(0, nums.length, new boolean[nums.length], new ArrayList<Integer>(), nums);
        return result;
    }

    private void genPerm(int depth, int N, boolean[] visited, List<Integer> tmp, int[] nums) {
        if (depth == N) {
            result.add(new ArrayList<>(tmp));
            return;
        }
        for (int i = 0; i < nums.length; i++) {
            
            if (visited[i] || (i > 0 && nums[i]==nums[i-1] && !visited[i-1])) continue;

            visited[i] = true;
            tmp.add(nums[i]);
            genPerm(depth + 1, N, visited, tmp, nums);
            tmp.remove(tmp.size()-1);
            visited[i] = false;
        }
    } 
}
profile
์šฐ๋‹นํƒ•ํƒ•

0๊ฐœ์˜ ๋Œ“๊ธ€