Skip to content
Open
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package study.ssafy.bundler;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class 컨베이어벨트위의로봇_정세권 {

static int N, K, M, duCunt, cycle;
static int[] belt, robot;


public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;

st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
M = 2*N;
belt = new int[M];
robot = new int[N];

st = new StringTokenizer(br.readLine());
for (int i = 0; i < M; i++)
belt[i] = Integer.parseInt(st.nextToken());

while (duCunt < K) {
setRobot();
moveBelt();
moveRobot();
++cycle;
}

System.out.println(cycle);


System.out.println(Arrays.toString(belt));


}

private static void setRobot() {
if (belt[0] != 0) {
robot[0] = 1;
belt[0] -= 1;
if (belt[0] == 0) ++duCunt;
}
}

private static void moveBelt() {
// belt만 돌리기
int beltLast = belt[M-1];
for (int i = M-1; i > 0; i--)
belt[i] = belt[i-1];
belt[0] = beltLast;

// 로봇만 돌리기
for (int i = N-1; i > 0; i--)
robot[i] = robot[i-1];
robot[N-1] = 0;
}

private static void moveRobot() {
for (int i = N-2; i >0; i--) {
if (robot[i] == 0 || belt[i+1] == 0) continue;
robot[i+1] = robot[i];
belt[i+1] -= 1;
if (belt[i+1] == 0) --duCunt;
}
robot[N-1] = 0;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package study.ssafy.bundler;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

/*
* [결과] SUCCESS
*
* [상태] 구글링 함^^
*
* [접근] (1) 완탐으로 문제 품 -> 메모리 초과
* (2) Map을 -> bar -> comp : 압축 하여 풀었음 -> 메모리 초과
* => 원래 map 자체가 너무 커서 메모리 초과가 난걸로 유추 중..
* (3) Star의 좌표 기준으로 3중 for문으로 품 ->
*/

public class 하늘에서별똥별이빗발친다_정세권 {

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;

st = new StringTokenizer(br.readLine());

int N = Integer.parseInt(st.nextToken()); // 구역 가로 길이
int M = Integer.parseInt(st.nextToken()); // 구역 세로 길이
int L = Integer.parseInt(st.nextToken()); // 정사각형 트램펄린 한 변의 길이
int K = Integer.parseInt(st.nextToken()); // 별똥별의 수

int[][] star = new int[K][2];

// 별의 좌표 값을 저장 하는 2차 배열
int x = 0, y = 0;
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
x = Integer.parseInt(st.nextToken());
y = Integer.parseInt(st.nextToken());
star[i][0] = x;
star[i][1] = y;
}


// (1) 완탐 -> 메모리 초과
// while(width <= N-L) { // 가로의 최대 길이
// while(height <= M-L) { // 세로의 최대 길이
//
// for (int i = width; i <= width+L; i++) {
// for (int j = height; j <= height+L; j++) {
// if (map[i][j] == 0) continue;
// tempStar++;
// }
// } // 트램펄린 한바퀴를 돌았을때 막는 Star의 수 = tempStar
//
// maxStar = (maxStar>tempStar)? maxStar: tempStar; // 트램펄린을 구역의 지도별로 탐색했을때, 가장 별을 많이 막은 갯수로 갱신
// tempStar = 0; // 해당 트램펄린 막은 별의 갯수 0으로 초기화
// ++height; // 세로 1 증가
// }
// height = 0; // 높이 0으로 초기화
// ++width; // 가로 1 증가
// }


// (2) map -> bar -> comp -> 메모리 초과
// int temp = 0;
// for (int j = 0; j <= N; j++) {
// for (int i = 0; i <= L; i++) {
// temp += map[i][j];
// }
// bar[0][j] = temp;
// temp = 0;
// }
//
// for (int i = 1; i <= M-L; i++) {
// for (int j = 0; j <= N; j++) {
// bar[i][j] = bar[i-1][j] + map[i+L][j] - map[i-1][j];
// }
// }
//
// temp = 0;
// for (int i = 0; i <= M-L; i++) {
// for (int j = 0; j <= L; j++) {
// temp += bar[i][j];
// }
// comp[i][0] = temp;
// temp = 0;
// maxStar = (maxStar > comp[i][0])? maxStar: comp[i][0];
// }
//
// for (int i = 0; i <= M-L; i++) {
// for (int j = 1; j <= N-L; j++) {
// comp[i][j] = comp[i][j-1] + bar[i][j+L] - bar[i][j-1];
// maxStar = (maxStar > comp[i][j])? maxStar: comp[i][j];
// }
// }

// (3) star 좌표 기준으로 완탐 -> 별의 x좌표와 y좌표를 이중 for문으로 탐색하여 그 안에서 +L방향의 트램펄린 안에 포함되는 star의 갯수 count
int maxStar = 0;
int tempStar = 0;
int starX = 0, starY = 0;
for (int i = 0; i < K; i++) { // star의 x좌표 분해
for (int j = 0; j < K; j++) { // star의 y좌표 분해 -> 즉, x와 y의 수직 좌표의 교차점을 모두 구함
x = star[i][0];
y = star[j][1];
tempStar = 0;

for (int l = 0; l < K; l++) { // 좌표의 교차점을 모두 구했으므로 트램펄린 양의 방향 +L만 고려하면 됨
starX = star[l][0];
starY = star[l][1];
if (x<=starX && starX<=x+L && y<=starY && starY<=y+L) tempStar++; // +L의 방향으로 포함되는 별의 갯수 카운팅
}
maxStar = (maxStar > tempStar)? maxStar: tempStar; // 최댓값 매번 갱신
}
}

System.out.println(K-maxStar);
}

}
75 changes: 75 additions & 0 deletions common/boj/wk3_2_알파벳_BOJ1987/알파벳_정세권.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package study.ssafy.bundler;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_알파벳_정세권 {

static int R, C;
static char[][] map;

static int cnt, maxCnt;
static boolean[] visited = new boolean[91]; // A = 65, Z = 90

static int[] dr = {-1, 0, 1, 0};
static int[] dc = {0, 1, 0, -1};

public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;

// 기본 값 받기
st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken()); // row 값
C = Integer.parseInt(st.nextToken()); // column 값
map = new char[R][C];

// 알파벳 배열 받기
for (int i = 0; i < R; i++) {
char[] temp = br.readLine().toCharArray();
for (int j = 0; j < C; j++) {
map[i][j] = temp[j];
}
}


// main logic
cnt = 1;
visited[map[0][0]+0] = true; // map[0][0] 위치 방문 처리

bfs(0, 0); // bfs 탐색

// 가장 긴 배열 출력
System.out.println(maxCnt);

}

// 메인 bfs logic
private static void bfs(int row, int col) {
// 최댓값 갱신
maxCnt = maxCnt > cnt? maxCnt: cnt;

// 4방 탐색
for (int i = 0; i < 4; i++) {
int nextR = row + dr[i];
int nextC = col + dc[i];

// 경계 조건 처리 : (1) 경계 외 값 (2) 이미 방문한 문자 제외
if (nextR < 0 || nextR >= R || nextC < 0 || nextC >=C
||visited[map[nextR][nextC]+0]) continue;

// 방문 처리, cnt 1 증가
visited[map[nextR][nextC]+0] = true;
++cnt;

// bfs
bfs(nextR, nextC);

// 미방문 처리, cnt 1 감소
visited[map[nextR][nextC]+0] = false;
--cnt;
}
}
}