Level 2
[PCCP ๊ธฐ์ถ๋ฌธ์ ] 2๋ฒ / ํผ์ฆ ๊ฒ์ ์ฑ๋ฆฐ์ง JAVA ์ฝ๋
n
๊ฐ์ ํผ์ฆ์ ์ ํ ์๊ฐ limit
๋ด์ ํ์ด์ผ ํจdiffs[i]
level
์ด diffs[i]
๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด times[i]
๋ง์ ๋ฐ๋ก ํlevel < diffs[i]
๋ฉด (diffs[i] - level + 1) * times[i]
์ผ๋ก ํ์ฌ ํผ์ฆ์ ํ๊ณ , times[i-1]
๋ก ์ ํผ์ฆ์ ๋ค์ ํ๊ณ ์์ผ ํ๋ค์ด๋ถํ์์ผ๋ก ์ต์ ๋ต์์ ์ฐพ์๋ค.
start = 1, end = 100000
check
ํจ์๋ฅผ ์ํํ๋คcheck
ํจ์๋ ์ค๊ฐ๊ฐ์ ์๋ จ๋๋ก ๊ฐ์ ํ์ฌ ํผ์ฆ์ ํ์ด์ ์๊ฐ ์ ํ ๋ด์ ๊ฐ๋ฅํ์ง boolean
๊ฐ์ผ๋ก ๋ฆฌํดํ๋คend = mid - 1
๋ก ๋ค์ ์ด๋ถํ์์ ์ํํ๋คstart = mid + 1
๋ก ๋ ๋์ ์๋ จ๋๋ก ํ์ํ๋คpublic int solution(int[] diffs, int[] times, long limit) {
int answer = 0;
int start = 1, end = 100000;
while (start <= end) {
int mid = start + (end - start)/2;
if (check(mid, diffs, times, limit)) {
answer = mid;
end = mid - 1;
} else {
start = mid + 1;
}
}
return answer;
}
private boolean check(int mid, int[] diffs, int[] times, long limit) {
long timeTaken = times[0];
for (int i = 1; i < diffs.length; i++) {
if (diffs[i] <= mid) {
timeTaken += times[i];
} else {
timeTaken += (diffs[i] - mid) * (times[i] + times[i-1]) + times[i];
}
}
return limit >= timeTaken;
}
lvl2
์ด๋ชจํฐ์ฝ ํ ์ธํ์ฌ JAVA ์ฝ๋
n
๋ช
์ ์นด์นด์คํก ์ฌ์ฉ์์๊ฒ ์ด๋ชจํฐ์ฝ m
๊ฐ๋ฅผ ํ ์ธํ์ฌ ํ๋งคํ๋คusers
์ ๊ธธ์ด = n
<= 100users[i]
๋ [๋น์จ, ๊ฐ๊ฒฉ]emoticons
์ ๊ธธ์ด = m
<= 7emoticons
์ ์์๋ 100์ ๋ฐฐ์private static final int[] discounts = {10, 20, 30, 40};
private void genComb(int depth, int[] res, int[][] users, int[] emoticons) {
if (depth == emoticons.length) {
...
return;
}
for (int i = 0; i < discounts.length; i++) {
res[depth] = discounts[i];
genComb(depth + 1, res, users, emoticons);
}
}
๊ฐ ์ฌ์ฉ์์ ๋ํด ์ด๋ชจํฐ์ฝ์ ํ ์ธ์จ์ ๋ฐฐ์ ํ ๊ฐ๊ฒฉ์ ์ดํฉ์ ๊ณ์ฐํ๊ณ , ์ด ๊ฒฐ๊ณผ๊ฐ ์ฌ์ฉ์์ ๊ธฐ์ค๋๋ ๊ธ์ก๋ณด๋ค ํฌ๋ฉด ๊ตฌ๋ ์๋ก ์ผ๋ค
if (depth == emoticons.length) {
int subs = 0, spentTotal = 0;
for (int[] user : users) {
int spent = 0;
for (int i = 0; i < emoticons.length; i++) {
if (res[i] >= user[0]) {
spent += emoticons[i] * (100 - res[i]) / 100;
}
}
if (spent >= user[1]) {
subs ++;
} else {
spentTotal += spent;
}
}
if (subs > subscribers) {
subscribers = subs;
profit = spentTotal;
} else if (subs == subscribers) {
profit = Math.max(profit, spentTotal);
}
return;
}
unrated
๊ฐ row์ column์ ๋ํด ํ์ฃผ๋ก ๊ฑด์ค์ด ๊ฐ๋ฅํ์ง ํ์ธํ๋ค
if(line[i] == line[i + 1]) continue;
3-1. boolean[] used
์ ๊ฒฝ์ฌ๋ก ๊ฑด์ค์ ์ฌ์ฉ๋ ์
์ ํ์ํด์ ํ๋์ ์
์ ๋ ๊ฐ ์ด์์ ๊ฒฝ์ฌ๋ก๊ฐ ๊ฒน์น์ง ์๋๋ก ๋ฐฉ์งํ๋ค
3-2. ์ธ๋ฑ์ค๊ฐ 0๋ณด๋ค ์์ผ๋ฉด ๋ฒ์ ๋ฐ์ผ๋ก ์คํจํ๋ค
3-3. ๋์ด๊ฐ ๋ค๋ฅด๋ฉด ๊ฒฝ์ฌ๋ก ๊ฑด์ค์ด ๋ถ๊ฐํ๋ค
else if(line[i] + 1 == line[i + 1]){
for(int j = 0; j < X; j++){
int idx = i - j;
if(idx < 0 || line[idx] != line[i] || used[idx]){
return false;
}
used[idx] = true;
}
}
4-1. 3-1์ ๋์ผ
4-2. ์ธ๋ฑ์ค๊ฐ N๋ณด๋ค ํฌ๊ฑฐ๊ฐ ๊ฐ์ผ๋ฉด ๋ฒ์ ๋ฐ์ผ๋ก ์คํจํ๋ค
4-3. 3-3์ ๋์ผ
4-4. ํ์ ์ค์ธ i ์ธ๋ฑ์ค๋ฅผ X-1 ๋งํผ ์ด๋์์ผ์ ๊ฒฝ์ฌ๋ก ์ดํ๋ถํฐ ํ์์ ์งํํ๋๋ก ํ๋ค
else if(line[i] - 1 == line[i + 1]){
for(int j = 1; j <= X; j++){
int idx = i + j;
if(idx >= N || line[idx] != line[i + 1] || used[idx]){
return false;
}
used[idx] = true;
}
i += X - 1;
}
lvl 2
์ถฉ๋์ํ ์ฐพ๊ธฐ JAVA ์ฝ๋
n
๊ฐ์ ํฌ์ธํธ๊ฐ ์กด์ฌํ๋คn
<= 100routes[i]
์ ๊ฒฝ๋ก๋ฅผ ๊ฐ๋๋คrow ๋จผ์ ์์ง์ด๋ฏ๋ก y๊ฐ๋ถํฐ ๋ณ๊ฒฝํ๊ณ , ๊ทธ ๋ค์ x๊ฐ์ ๋ณ๊ฒฝํ๋ค
longestPath
๋ณ์๋ staticํ๊ฒ ๊ฐ์ฅ ๊ธด ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ์ ์ฅํ์ฌ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ๋์์ ํ์ํ ๋ ์ฌ์ฉํ๋ค
private List<int[]> findRoute(int[] route, int[][] points) {
List<int[]> path = new ArrayList<>();
int[] way = new int[route.length];
for (int i =0 ; i < route.length; i++) {
way[i] = route[i] -1;
}
int y = points[way[0]][0], x = points[way[0]][1];
path.add(new int[] {y, x});
for (int i = 1; i < route.length; i++) {
int nextY = points[way[i]][0], nextX = points[way[i]][1];
int[] move = new int[2];
while (y != nextY) {
if (y < nextY) {
y ++;
path.add(new int[] {y, x});
} else {
y --;
path.add(new int[] {y, x});
}
}
while (x != nextX) {
if (x < nextX) {
x ++;
path.add(new int[] {y, x});
} else {
x --;
path.add(new int[] {y, x});
}
}
}
longestPath = Math.max(longestPath, path.size());
return path;
}
public int solution(int[][] points, int[][] routes) {
int answer = 0;
List<List<int[]>> allRoutes = new ArrayList<>();
// ๊ฐ ๋ก๋ด์ ๊ฒฝ๋ก์ ๋ํด ์์ธ ๊ฒฝ๋ก๋ฅผ ์ํฉํ๋ค
for (int[] route : routes) {
allRoutes.add(findRoute(route, points));
}
// 0์ด๋ถํฐ ๊ฐ์ฅ ๊ธด ์์ธ ๊ฒฝ๋ก๊ฐ ๊ฑธ๋ฆฐ ์๊ฐ๊น์ง ํ์ํ๋๋ฐ,
for (int i = 0 ; i < longestPath; i++) {
// ๊ฐ์ ์๊ฐ๋์ ๊ฐ์ ์์น์ ์กด์ฌํ๋ ๋ก๋ด์ ๊ฐ์๋ฅผ ์ ์ฅํ๋ค
Map<Point, Integer> map = new HashMap<>();
for (int j = 0; j < allRoutes.size();j++) {
if (i >= allRoutes.get(j).size()) continue;
int[] loc = allRoutes.get(j).get(i);
Point p = new Point(loc[0], loc[1]);
if (!map.containsKey(p)) map.put(p, 1);
else map.put(p, map.get(p) + 1);
}
for (Map.Entry<Point, Integer> e : map.entrySet()) {
if (e.getValue()>= 2) answer++;
}
}
return answer;
}
Point ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๋ค
static class Point {
int r, c;
Point(int r, int c) {
this.r =r;
this.c=c;
}
@Override
public boolean equals(Object o) {
if (o == this) return true;
Point p = (Point) o;
if (p.r == this.r && p.c == this.c) return true;
return false;
}
@Override
public int hashCode() {
return Objects.hash(r, c);
}
}