๋ฌผ๊ณ ๊ธฐ ์ข ๋ฅ ๋ณ๋ก ๊ฐ์ฅ ํฐ ๋ฌผ๊ณ ๊ธฐ์ 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
๋ฌธ์ ํฌํจํ ์ ์๋ค.
GROUP BY
์ ์ ๋ช
์๋ ๊ธฐ์ค ์ปฌ๋ผHAVING
์ ๋ ๋ค์๊ณผ ๊ฐ์ ์ ์ฝ์ฌํญ์ ๊ฐ๋๋ค.
GROUP BY
์ ์ ๋ช
์๋ ์ปฌ๋ผ๋ง ๋ช
์ ๊ฐ๋ฅ๊ทธ๋์ ์ด์ค 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;
๋๋ฒ์งธ๋ก ๋์ ์ ๋ํฌ 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;
๊ฐ ๋
ธ๋๊ฐ 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;
}
์ค๋ณต ์ซ์๊ฐ ๊ฐ๋ฅํ ์งํฉ์ ๋ํ์ฌ ๋ชจ๋ ์ซ์๋ฅผ ์ฌ์ฉํ๋ ๊ณ ์ ์์ด์ ๋ชจ๋ ์ถ๋ ฅํ๋ค
์
๋ ฅ๊ฐ: 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;
}
}
}