๋ฌธ์ 1๏ธโฃ (๐ ๋ฆฌํธ ์ฝ๋ _ ์ต๋๋ ์ต์๋ ์๋ ๊ฐ ์ฐพ๊ธฐ)
๐ก IDEA : ๋ฐฐ์ด ์ ๋ชจ๋ ๊ฐ์ด distinct ํ๋ค๋ ์ฑ์ง์ ์ด์ฉํ๋ค. ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ 2 ์ดํ๋ฉด ๋ฐ๋ก -1 ์ ๋ฐํํ๊ณ , ์ด ์ธ์ ๊ฒฝ์ฐ Arrays.sort ๋ฅผ ํตํด ๋ฐฐ์ด์ ์ ๋ ฌํ ํ ํด๋น ๋ฐฐ์ด์ ์ธ๋ฑ์ค 1 ๊ฐ์ ๋ฐํํ๋ค.
import java.util.Arrays;
class Solution {
public int findNonMinOrMax(int[] nums) {
if (nums.length <= 2) return -1;
Arrays.sort(nums);
return nums[1];
}
}
๋ฌธ์ 2๏ธโฃ (๐ ๋ฆฌํธ์ฝ๋ _ Top ๋น๋์ k ๊ฐ ๊ตฌํ๊ธฐ)
๐ก IDEA : Num ํด๋์ค๋ฅผ ์์ฑํ์ฌ Array.sort ๋ฅผ ํตํด ์ ๋ ฌ๋ nums ๋ฐฐ์ด์ ํ๋ฒ ๋๋ฉด์ ๋ฐฐ์ด ์ ์ซ์์ ๊ฐ์๋ฅผ ๊ณ์ฐํ๋ค. ์ด๋ ๋์์ PriorityQueue ์ Num ๊ฐ์ฒด๋ฅผ ๋ด๋๋ค. ์ด๋ PriorityQueue ์ ์ ๋ ฌ ๊ธฐ์ค์ ์ซ์ ๊ฐ์์ ๋ด๋ฆผ ์ฐจ์์ด๋ค. ์ดํ k ๊ฐ ๋งํผ Queue ์์ poll ํด์ ์ ๋ต ๋ฐฐ์ด์ ๋ด์ ๋ฐํํ๋ค.
import java.util.PriorityQueue;
import java.util.Arrays;
// Num ํด๋์ค ์ ์ธ
class Num implements Comparable<Num> {
int num;
int cnt;
// ์์ฑ์
public Num (int num, int cnt) {
this.num = num;
this.cnt = cnt;
}
// PriorityQueue ์ ๋ ฌ ๊ธฐ์ค
public int compareTo (Num other) {
return other.cnt - this.cnt;
}
}
class Solution {
public int[] topKFrequent(int[] nums, int k) {
// (1) PriorityQueue ์์ฑ ๋ฐ nums ๋ฐฐ์ด ์ ์ซ์ ์ธ๊ธฐ
PriorityQueue<Num> pq = new PriorityQueue<>();
Arrays.sort(nums);
int cnt = 1;
for (int i=0; i<nums.length-1; i++) {
if (nums[i] == nums[i+1]) {
cnt++;
}
else {
pq.add(new Num(nums[i], cnt));
cnt = 1;
}
}
if (cnt == 1) { // ๋ง์ง๋ง ๊ฐ ๋ด๊ธฐ
pq.add(new Num(nums[nums.length-1], 1));
}
else {
pq.add(new Num(nums[nums.length-1], cnt));
}
// (2) ๊ฐ์ ์ธ๊ธฐ๋ฅผ ๋ง์น ํ PriorityQueue ์์ Top k ๊ฐ๋ฅผ ๋นผ๋ธ ํ answer ๋ฐฐ์ด์ ๋ด๊ธฐ
int[] answer = new int[k];
for (int i=0; i<k; i++) {
answer[i] = pq.poll().num;
}
return answer;
}
}
/*
์กฐ๊ฑด
โก๏ธ ๊ฐ์ฅ ๋น๋๊ฐ ๋์ k ๊ฐ์ ์ซ์๋ฅผ ๋ฐฐ์ด๋ก ๋ฐํ
โก๏ธ ์๊ฐ ๋ณต์ก๋๊ฐ O(n logn) ์์ชฝ์ผ๋ก, n ์ nums ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ์๋ฏธ
*/
๋ฌธ์ 3๏ธโฃ (๐ ๋ฆฌํธ ์ฝ๋ _ ๊ทธ๋ํ๋ฅผ ํํํ๊ธฐ ์ํ ์ต์ ์ ์ ๊ฐฏ์)
๐ก IDEA : ๋ฐฐ์ด ์ ๋ ฌ์ ์ํ ํ ํ, ์ ํ ๊ธฐ์ธ๊ธฐ ๋น๊ต๋ฅผ ํตํด ์ ์ถ๊ฐ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
โ ์ด๊ธฐ IDEA

โก๏ธ ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ์ธ๊ธฐ ๊ณ์ฐ์ ์ฌ์ฉํ๋ (y2 - y1) / (x2 - x1) ์ double ์๋ฃํ์ ํตํด์ ๋น๊ตํ๋ฉด ์ ํํ ๋น๊ต๊ฐ ๋ ์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ณ , ํด๋น ์์ด๋์ด๋ฅผ ๋ฐํ์ผ๋ก ์๋์ ๊ฐ์ด ๋น๊ต ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
while (!pq.isEmpty()) {
now = next;
next = pq.poll();
double nowDir = (double) (now.price-next.price) / (now.day-next.day);
if (preDir != nowDir) answer++;
preDir = nowDir;
}
โก๏ธ ๊ทธ๋ฌ๋ ์ด๋ ๊ฒ ์์ฑํ์ ๋ double ๋ํ 64bit ์ ์ ํ ๋นํธ์๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋น๊ต๋ ๊ฐ์ด ์์ฃผ ์์ ์ฐจ์ด๋ก ๋ค๋ฅด๊ฒ ๋๋ฉด ๋ฐ์ฌ๋ฆผ ๊ณผ์ ์์ ๋ ๊ฐ์ด ๋์ผํ ํน์ ๊ฐ์ ์๋ ดํ๋ฉด์ ์ ํํ ์ธก์ ์ด ์ด๋ ค์์ง๊ณ , ์ด๋ก ์ธํด ํด๋น ํ ์คํธ์ผ์ด์ค์์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ์ด ๋์ค๊ฒ ๋๋ค.
โก ์์ ๋ IDEA

โก๏ธ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ธฐ์ธ๊ธฐ๋ฅผ ์ง์ ๊ตฌํ๋ ๋ฐฉ์์ด ์๋ ๋น๋ก ๊ด๊ณ๋ฅผ ํ์ธํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ์๋ค. ํด๋น ๋ฐฉ์์ ๊ณฑ์ ์ด์ฉํ๋ ๋ฐฉ์์ผ๋ก ๊ธฐ์กด ๋ฐฉ์์ฒ๋ผ ๋ฐ์ฌ๋ฆผ์ ํผํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ฐจ ๋ฒ์๊ฐ ํ์ฐํ ์ค์ด๋ฌ๊ณผ ๋์์ long ์๋ฃํ์ ์ฌ์ฉํ๋ฏ๋ก์ ์ค๋ฒํ๋ก์ฐ๋ฅผ ๋ฐฉ์งํ์ฌ ์ ํ๋๋ฅผ ๋ ๋์ผ ์ ์๋ค.
while (!pq.isEmpty()) {
left = mid;
mid = right;
right = pq.poll();
long dir_1 = (mid.price - left.price)*(right.day - mid.day);
long dir_2 = (right.price -mid.price)*(mid.day - left.day);
if (dir_1 != dir_2) answer++;
}
โข ๊ฐ์ ์ ์ฝ๋
import java.util.PriorityQueue;
class Chart implements Comparable<Chart> {
int day;
int price;
public Chart (int day, int price) {
this.day = day;
this.price = price;
}
@Override
public int compareTo (Chart other) {
return this.day - other.day;
}
}
class Solution {
public int minimumLines(int[][] stockPrices) {
if (stockPrices.length <= 2) {
return stockPrices.length-1;
}
// (1) stockPrices ๋ฐฐ์ด ์ ๋ฆฌ
PriorityQueue<Chart> pq = new PriorityQueue<>();
for (int[] stock : stockPrices) {
pq.add(new Chart(stock[0], stock[1]));
}
// (2) ์ฐจํธ ์ ๋ฆฌ
int answer = 1;
Chart left = null;
Chart mid = pq.poll();
Chart right = pq.poll();
while (!pq.isEmpty()) {
left = mid;
mid = right;
right = pq.poll();
long dir_1 = (mid.price - left.price)*(right.day - mid.day);
long dir_2 = (right.price -mid.price)*(mid.day - left.day);
if (dir_1 != dir_2) answer++;
}
return answer;
}
}
โก๏ธ day ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ ์ ๋ ฌํ๊ธฐ ์ํด์ Char ํด๋์ค๋ฅผ ์์ฑํ๊ณ PriorityQueue ๋ฅผ ์ฌ์ฉํ์๋๋ฐ ์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ ์๊ฐ๋ณต์ก๋ ๋ฐ ๊ณต๊ฐ๋ณต์ก๋๊ฐ ๋์์ง๊ฒ ๋๋ค.
โฃ ๊ฐ์ ๋ฐ ์ต์ข ์ฝ๋
import java.util.Arrays;
class Solution {
public int minimumLines(int[][] stockPrices) {
if (stockPrices.length <= 2) return stockPrices.length-1;
// (1) day ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
Arrays.sort(stockPrices,(o1,o2)-> o1[0]-o2[0]);
// (2) ์ ์ฒด๋ฅผ ๋๋ฉด์ ๊ธฐ์ธ๊ธฐ ๋น๋ก ๊ด๊ณ ํ์ธ
int answer = 1;
for (int i=0; i<stockPrices.length-2; i++) {
int x1 = stockPrices[i][0];
int x2 = stockPrices[i+1][0];
int x3 = stockPrices[i+2][0];
int y1 = stockPrices[i][1];
int y2 = stockPrices[i+1][1];
int y3 = stockPrices[i+2][1];
long dir_1 = (y2-y1)*(x3-x2);
long dir_2 = (y3-y2)*(x2-x1);
if (dir_1 != dir_2) answer++;
}
// (3) ์ ๋ต ๋ฐํ
return answer;
}
}
โก๏ธ Array.sort ๊ณผ์ ์์ day ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ค๋ ๋๋ค ํํ์์ ํตํด sort ๊ณผ์ ์์ ํ์ํ Comparator ์ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ์ฌ ๋จ๊ณ๋ฅผ ์ค์๋ค. Comparator ์ ๋ด๋ถํจ์์ธ int compare(T o1, T o2) ๋ฅผ ๋๋ค์์ ํตํด ํํํ๋ค๊ณ ํ ์ ์๋ค.
// Comparator ๋ฉ์๋
int compare(T o1, T o2);
// ๋๋ค ํํ ๋ฐฉ์
Arrays.sort(stockPrices, (o1, o2) -> o1[0] - o2[0]);'TIL ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| TIL (2024.06.16) (0) | 2024.06.17 |
|---|---|
| TIL (2024.06.15) (0) | 2024.06.16 |
| TIL (2024.06.14) (0) | 2024.06.15 |
| TIL (2024.06.13) (1) | 2024.06.15 |
| TIL (2024.06.12) (0) | 2024.06.13 |