Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions src/week8/가장 긴 팰린드롬/Solution.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
## ✏️ [프로그래머스] 가장 긴 팰린드롬
📶 문제 난이도
Lv. 3

🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12904

⏱️ 풀이 시간
10분

✅ 풀이 근거


*/

// 브루투포스 해도 될듯

// i를 시작, j를 끝으로 하는 애가 팰린드롬인지 체크하는건 j-i / 2 번 연산
// O(N^2) 으로 해결될 것이다.
// 아 N^3 이네
class Solution {
public int solution(String s) {
int answer = 0;

for (int i = 0; i < s.length(); i++) {
for (int j = s.length() - 1; j >= 0; j--) {
if (answer < j - i + 1 && check(s.substring(i, j + 1))) {
answer = j - i + 1;
// System.out.println(s.substring(i, j+1) +" " + answer);
}
}
}

return answer;
}

private boolean check(String str) {
int l = 0;
int r = str.length() - 1;
while (l < r) {
if (str.charAt(l) != str.charAt(r))
return false;
l++;
r--;
}
return true;
}
}


129 changes: 129 additions & 0 deletions src/week8/리코챗로봇/Solution.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
/*
## ✏️ [프로그래머스] 리코챗 로봇

📶 문제 난이도
Lv. 2

🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/169199

⏱️ 풀이 시간
30분

✅ 풀이 근거
Bfs 문제인데 그냥 상하좌우 한칸이 아니라 벽까지 쭉 밀어버리면 되는 문제
*/

import java.util.*;

class Node {
int x, y, cnt;

public Node(int x, int y, int cnt) {
this.x = x;
this.y = y;
this.cnt = cnt;
}
}

class Solution {
int N, M;
int[][] map;

public int solution(String[] board) {
int answer = 0;
this.N = board.length;
this.M = board[0].length();

map = new int[N][M];
int startX = 0;
int startY = 0;
int targetX = 0;
int targetY = 0;

for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
char c = board[i].charAt(j);

if (c == 'D') {
map[i][j] = 1;
continue;
}
if (c == 'G') {
targetY = i;
targetX = j;
continue;
}
if (c == 'R') {
startY = i;
startX = j;
continue;
}
}
}


boolean[][] visited = new boolean[N][M];
ArrayDeque<Node> q = new ArrayDeque<>();

q.add(new Node(startX, startY, 0));
visited[startY][startX] = true;

while (!q.isEmpty()) {
Node cur = q.poll();

for (int d = 0; d < 4; d++) {
Node next = getNext(cur, d);
if (next.y >= 0 && next.y < N && next.x >= 0 && next.x < M && !visited[next.y][next.x]) {
visited[next.y][next.x] = true;
q.add(next);
if (next.y == targetY && next.x == targetX) return next.cnt;
}
}
}

return -1;
}

private Node getNext(Node cur, int d) {
int x = cur.x;
int y = cur.y;

// 좌
if (d == 0) {
while (x > 0) {
if (map[y][x - 1] == 1)
break;
x--;
}
}

// 우
else if (d == 1) {
while (x < M - 1) {
if (map[y][x + 1] == 1)
break;
x++;
}
}

// 상
else if (d == 2) {
while (y > 0) {
if (map[y - 1][x] == 1)
break;
y--;
}
}

// 하
else {
while (y < N - 1) {
if (map[y + 1][x] == 1)
break;
y++;
}
}
return new Node(x, y, cur.cnt + 1);
}
}
107 changes: 107 additions & 0 deletions src/week8/충돌위험 찾기/Solution.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
/*
## ✏️ [프로그래머스] 할인 행사

📶 문제 난이도
Lv. 2

🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/131127

⏱️ 풀이 시간
30분

✅ 풀이 근거
// n, x가 100 보다 세제곱도 가능 따라서 브루트포스 문제
*/

import java.util .*;

// class Node{
// int x, y, depth;
// ArrayList<Node> paths;
// public Node(int x, int y, int depth, ArrayList<Node> paths) {
// this.x = x;
// this.y = y;
// this.depth = depth;
// this.paths = paths;
// }
// }

class Solution {
public int solution(int[][] points, int[][] routes) {
int answer = 0;
int[][][] visited = new int[30000][101][101]; // [sec][x][y] sec초에 (x, y)를 몇회 방문함

for (int[] route : routes) {

int sec = 0;

int[] start = points[route[0] - 1];

int fromY = start[0];
int fromX = start[1];

// 최초 시작 위치만 한 번 기록
visited[sec][fromX][fromY]++;

for (int node = 0; node < route.length - 1; node++) {

int[] to = points[route[node + 1] - 1];

int toY = to[0];
int toX = to[1];

while (fromY != toY) {
if (fromY < toY) {
fromY++;
} else {
fromY--;
}

sec++;
visited[sec][fromX][fromY]++;
}

while (fromX != toX) {
if (fromX < toX) {
fromX++;
} else {
fromX--;
}

sec++;
visited[sec][fromX][fromY]++;
}
}
}

// for (int s = 0; s < 8; s++) {
// printArr(visited[s]);
// }

for (int[][] s : visited) {
for (int[] i : s) {
for (int j : i) {
if (j > 1) {
// 방문횟수가 1보다 크면 두개 이상의 로봇이 같은 초에 방문했으므로 충돌했다는 뜻
answer++;
}
}
}
}

return answer;
}

private void printArr(int[][] arr) {

for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
System.out.println();

}
}
Loading