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
Expand Up @@ -4,7 +4,7 @@
import java.io.OutputStreamWriter;
import java.util.PriorityQueue;

public class Main {
public class Main1 {

static int N;
static int[][] map;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import java.util.PriorityQueue;
import java.util.Queue;

public class Main {
public class Main2 {

static int N, min;
static int[][] map;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main20055 {
static int head,tail,zeroCnt,step,N,M;
// head 올리는 위치
// tail 내리는 위치
// zeroCnt 내구도 0 개수
// step 현재 단계
static boolean[] robots;
static int[] hp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");//N,K입력
N = Integer.parseInt(st.nextToken()); // 2 <= N <=100
tail = N-1;// tail 초기값 = N-1
M=N*2;//어차피 2N으로 쓰기 떄문에

int K = Integer.parseInt(st.nextToken());

hp = new int[M];//내구도 저장할 배열
robots = new boolean[M]; // 해당 위치 로봇 여부 체크 배열

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

for (int i = 0; i <M ; i++) {
hp[i] = Integer.parseInt(st.nextToken());
}

while (true){
step++;
movebelt(); //벨트 이동
robotOff();; // 로봇 내리기
robotMove();//맨 앞에서부터 로봇 이동
robotOn();//맨 앞에 로봇 올리기
if(zeroCnt>=K){
break;
}
}
System.out.println(step);

}
public static int filter(int num){
if(num<0) return M+num;
if(num>=M) return num%M;
return num;
}
public static void movebelt(){
head = filter(--head);
tail = filter(--tail);
}
public static void robotOff(){
robots[tail] = false;
}
public static void robotMove(){
int start = filter(tail-1); //검사 시작칸 맨 끝에선 이미 내렸으니깐. tail-1부터 시작
int scope = N-1;//검사할 칸 수, 맨 끝칸 제외니깐 N-1;
for (int i = 0; i < scope; i++) {
int pos = filter(start-i);
int next =filter(pos + 1);
//로봇이 있고, 다음칸에 로봇이 없고 내구도가 0이 아니라면
if (robots[pos] && !robots[next] && hp[next] > 0) {
//현재 위치 비우고 다음칸으로 이동,
robots[pos] = false;
if (next != tail)//다음칸이 tail이라면 로봇 바로 내리기 떄문에 패스
robots[next] = true;
// 내구도-1, 0됐으면 zeroCnt +1
if (--hp[next] == 0)//내구도 0되면 카운트 +1
{
System.out.println("hihih");
zeroCnt++;
}
}
;
}
}
public static void robotOn(){
if(hp[head]>0) {
if(--hp[head]==0){
System.out.println("wwwww");
zeroCnt++;
}else{
robots[head] = true;
}
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
static int head,tail,zeroCnt,step,N,M;
// head 올리는 위치
// tail 내리는 위치
// zeroCnt 내구도 0 개수
// step 현재 단계
static boolean[] robots;
static int[] hp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");//N,K입력
N = Integer.parseInt(st.nextToken()); // 2 <= N <=100
tail = N-1;// tail 초기값 = N-1
M=N*2;//어차피 2N으로 쓰기 떄문에

int K = Integer.parseInt(st.nextToken());

hp = new int[M];//내구도 저장할 배열
robots = new boolean[M]; // 해당 위치 로봇 여부 체크 배열

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

for (int i = 0; i <M ; i++) {
hp[i] = Integer.parseInt(st.nextToken());
}

while (true){
step++;
movebelt(); //벨트 이동
robotOff();; // 로봇 내리기
robotMove();//맨 앞에서부터 로봇 이동
robotOn();//맨 앞에 로봇 올리기
if(zeroCnt>=K){
break;
}
}
System.out.println(step);

}
public static int filter(int num){
if(num<0) return M+num;
if(num>=M) return num%M;
return num;
}
public static void movebelt(){
head = filter(--head);
tail = filter(--tail);
}
public static void robotOff(){
robots[tail] = false;
}
public static void robotMove(){
int start = filter(tail-1); //검사 시작칸 맨 끝에선 이미 내렸으니깐. tail-1부터 시작
int scope = N-1;//검사할 칸 수, 맨 끝칸 제외니깐 N-1;
for (int i = 0; i < scope; i++) {
int pos = filter(start-i);
int next =filter(pos + 1);
//로봇이 있고, 다음칸에 로봇이 없고 내구도가 0이 아니라면
if (robots[pos] && !robots[next] && hp[next] > 0) {
//현재 위치 비우고 다음칸으로 이동,
robots[pos] = false;
if (next != tail)//다음칸이 tail이라면 로봇 바로 내리기 떄문에 패스
robots[next] = true;
// 내구도-1, 0됐으면 zeroCnt +1
if (--hp[next] == 0)//내구도 0되면 카운트 +1
{
zeroCnt++;
}
};
}
}
public static void robotOn(){
if(hp[head]>0) {
if(--hp[head]==0){
zeroCnt++;
}
robots[head] = true;
};
}
}
55 changes: 55 additions & 0 deletions common/boj/wk2-2 고층건물_BOJ1207/Main1027.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main1027 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); //1 N =50
int[] heights = new int[N]; //높이를 저장하는 1차원 배열
StringTokenizer st = new StringTokenizer(br.readLine(), ); //높이 입력

for (int i = 0; i N; i++) {
heights[i] = Integer.parseInt(st.nextToken());
}

boolean[][] matrix = new boolean[N][N]; //서로 볼 수 있는지 기록하는 2차원 배열 0 자기자신 볼수 있으면 1, 없으면 -1
int maxCnt = 0;
//i=0 인 것부터
for (int i = 0; i< N; i++) {
int tempCnt = 0;
int h = heights[i]; //높이
//자신의 오른쪽 건물 순차적으로 선정
for (int j = i + 1; j < N; j++) {
int jh = heights[j]; //오른쪽 건물의 높이
double a = getSlope(i,h,j,jh);//기울기 계산
boolean canSee = true; //볼 수 있는지 체크하는 변수
//두 건물 사이에 있는 건물 순회
for (int k = i+1; k < j ; k++) {
int kh = heights[k];
double m = getSlope(i,h,k,kh);//기울기 계산
if(m >= a ){ //두 건물 사이에 기울기가 더 크거나 같은 건물이 있으면 false, break
canSee = false;
break;
}
}
if(canSee) {//볼 수 있으면 tempCnt 증가, matrix 표시
tempCnt++;
matrix[i][j] = true;
};
}
//자신의 왼쪽 건물과의 결과 중 1 인 것만큼 증가
for (int j = i-1; j >= 0 ; j--) {
if(matrix[j][i]) tempCnt++;
}
maxCnt = tempCnt > maxCnt ? tempCnt : maxCnt; //이전까지 최대 개수보다 크면 갱신
}
System.out.println(maxCnt);
}
//두점을 잇는 선분의 기울기 구하는 함수
public static double getSlope(int x1,int y1, int x2, int y2){
return (y1-y2) / (double) (x1-x2);
}

}
45 changes: 45 additions & 0 deletions common/boj/wk2-2 고층건물_BOJ1207/고층건물_안태윤.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); //1 N =50
int[] heights = new int[N]; //높이를 저장하는 1차원 배열
int[] numberInSites = new int[N]; // 해당인덱스에서 볼 수 있는 건물의 수를 저장하는 배열
StringTokenizer st = new StringTokenizer(br.readLine(), " "); //높이 입력

for (int i = 0; i < N; i++) {
heights[i] = Integer.parseInt(st.nextToken());
}

int maxCnt = 0;
//i=0 인 것부터
for (int i = 0; i< N; i++) {
double maxSlope = -Integer.MIN_VALUE; // 최대 기울값 저장 위한 변수
int h = heights[i]; //높이

//자신의 오른쪽 건물 순차적으로 선정
for (int j = i + 1; j < N; j++) {
int jh = heights[j]; //오른쪽 건물의 높이
double a = getSlope(i,h,j,jh);//기울기 계산
//기울기가 최대값보다 크면 최대값 갱신 및 현재 카운트 증가,
if(maxSlope < a){
maxSlope = a;
numberInSites[i]++;
numberInSites[j]++;
}

}
maxCnt = numberInSites[i] > maxCnt ? numberInSites[i] : maxCnt; //이전까지 최대 개수보다 크면 갱신
}
System.out.println(maxCnt);
}
//두점을 잇는 선분의 기울기 구하는 함수
public static double getSlope(int x1,int y1, int x2, int y2){
return (y1-y2) / (double) (x1-x2);
}

}
38 changes: 38 additions & 0 deletions common/boj/wk3_1_좋다_BOJ1253/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package wk3_1_좋다_BOJ1253;

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

public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 1<= N <= 2000
int[] numbers = new int[N];// N개의 숫자를 저장할 배열

StringTokenizer st = new StringTokenizer(br.readLine()," ");
HashMap<Integer, Integer> numberCnt = new HashMap<>();//N개의 숫자중 값이 같은 수의 개수를 저장하는 키-밸류
HashMap<Integer, Boolean> visited = new HashMap<>();//이미 한 번 처리한 숫자 값을 저장할 키-밸류

for (int i = 0; i < N; i++) {
numbers[i] = Integer.parseInt(st.nextToken()); // +- 1_000_000_000, 숫자 입력
Integer cur = numberCnt.get(numbers[i]); // 앞에 같은 값을 가지는 수가 몇개 나왔는지 검사
cur = cur == null ? 0 : cur;
numberCnt.put(numbers[i],cur+1);// 해당하는 값의 숫자++
}

int goodCnt = 0;
for (int i = 0; i < N; i++) {
for (int j = i+1; j < N; j++) {
int sum = numbers[i]+numbers[j];
Integer cnt = numberCnt.get(sum);
if(cnt != null && visited.get(sum) == null) {
goodCnt += cnt;
visited.put(sum, true);
}
}
}
System.out.println(goodCnt);
}
}
61 changes: 61 additions & 0 deletions common/boj/wk3_2_알파벳_BOJ1987/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package wk3_2_알파벳_BOJ1253;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;
import java.util.StringTokenizer;

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

public class Main{
static int[] dr = { -1, 1, 0, 0 };// 사방탐색 dr
static int[] dc = { 0, 0, -1, 1 };// 사방탐색 dc
static int[][] matrix;//대문자 저장
static int R,C;//현재 위치
static int max = 0;//최대 깊이

public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());

matrix = new int[R][C];

for (int i = 0; i < R; i++) {
String str = br.readLine();
for (int j = 0; j < C; j++) {
matrix[i][j] = str.charAt(j) - 'A'; // 'A'부터 시작이므로 int 로저장
}
}

dfs(1, 0, 0,1 << matrix[0][0]);// 비트마스킹 방문처리 dfs 시작

System.out.println(max);
}

static void dfs(int cnt, int r, int c, int visited) {
if (max == 26) return; // 대문자 개수 26개 이므로 26이 최대값
max = cnt > max ? cnt : max; //
for (int j = 0; j < 4; j++) { // 4방탐색
int nr = r + dr[j];
int nc = c + dc[j];

if (nr >= 0 && nr < R && nc >= 0 && nc < C) { // 범위 체크
int nChar = matrix[nr][nc]; // 다음 대문자
if ((visited & (1 << nChar)) == 0) { // 다음 대문자 방문 확인
//연산 결과를 전달하기 때문에 방문체크를 해제할 필요가 없다.
dfs(cnt + 1, nr, nc, visited | 1 << nChar);
}
}
}
}
}

Loading