REAL 복습 (3) 빙산/기타줄/N-Queen/조이스틱
2020-04-22
REAL 복습 (3)
4/8일자, 4/18일자
-
빙산 - 백준 1759 (Bfs)
:timer_clock: 10:55 - 12:00 (1h)
package Dfs_Bfs; import java.util.*; public class beak_빙산_re { static class Pos{ int x; int y; Pos(int x, int y){ this.x = x; this.y = y; } } static int arr[][]; static boolean visited[][]; static int n; static int m; static LinkedList<Pos> tozero; static LinkedList<Pos> notzero; static int dx[] = {0,0,1,-1}; static int dy[] = {1,-1,0,0}; public static boolean melt() { boolean b = false; int a_size = notzero.size(); for(int i=0; i<a_size; i++) { //사방 보면서 0이되면 tozero에 넣고, 0보다 크면 값 바꿔주고 위치 다시 넣고 Pos p = notzero.poll(); int cnt = 0; for(int j=0; j<4; j++) { int nx = p.x + dx[j]; int ny = p.y + dy[j]; if(nx>=0 && nx<n && ny>=0 && ny<m && arr[nx][ny] == 0) cnt++; } if(arr[p.x][p.y] - cnt > 0) { arr[p.x][p.y] -= cnt; notzero.add(new Pos(p.x, p.y)); b = true; } else tozero.add(new Pos(p.x,p.y)); } int b_size = tozero.size(); for(int i=0; i<b_size; i++) { Pos p = tozero.poll(); arr[p.x][p.y] = 0; visited[p.x][p.y] = false; } return b; // false라는건 0만 있다는 뜻 } public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); m = sc.nextInt(); arr= new int[n][m]; tozero = new LinkedList<>(); notzero = new LinkedList<>(); visited= new boolean [n][m]; sc.nextLine(); for(int i=0; i<n; i++) { String s[] = sc.nextLine().split(" "); for(int j=0; j<m; j++) { int x = Integer.parseInt(s[j]); arr[i][j] = x; if(x !=0) { notzero.add(new Pos(i,j)); visited[i][j] = true; } } } int year = 0; while(true) { if(!melt()) { year = 0; break; } //visited boolean ck[][] = new boolean [n][m]; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) ck[i][j] = visited[i][j]; } int size = 0; int c_size = notzero.size(); for(int i=0; i<c_size; i++) { Pos p = notzero.get(i); if(ck[p.x][p.y] == true) { size++; Queue<Pos> qu = new LinkedList<>(); qu.add(p); ck[p.x][p.y] = false; while(!qu.isEmpty()) { Pos pp = qu.poll(); for(int j=0; j<4; j++) { int nx = pp.x + dx[j]; int ny = pp.y + dy[j]; if(nx>=0 && nx<n && ny>=0 && ny<m && ck[nx][ny] == true) { qu.add(new Pos(nx,ny)); ck[nx][ny] = false; } } } } } year++; if(size >=2) break; } System.out.println(year); } }
- 다시 풀어도 시간초과…아….!!!!!!!!!!!!!!!!!!!!1
-
기타줄 - 백준 (Greedy)
⏲ 12:02 - 12:27 (25min)
package greeedy; import java.util.*; public class beak_기타줄_re { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int p = Integer.MAX_VALUE; int g = Integer.MAX_VALUE; for(int i=0; i<m; i++) { p = Math.min(p, sc.nextInt()); g = Math.min(g, sc.nextInt()); } int answer = 0; answer = Math.min(Math.min((n/6 + 1)*p, (n/6)*p + (n%6)*g),n*g); System.out.println(answer); } }
- 생각해내는데에 조큼 걸림!
- 여기서 키포인트는 min 패키지, min 낱개를 일단 구해놓는 것!
-
- 패키지로만 전부살건지
- 낱개로만 전부 살건지
- 패키지로 사고 + 나머지를 낱개로 살건지
-
N-Queen - 백준 (Backtracking)
⏲ 12:30 - 12:40 (10min)
package Backtracking; import java.util.*; public class beak_엔퀸_re { static int n; static int arr[][]; static int hang[]; static int answer = 0; public static boolean ck(int lev) { for(int i=0; i<lev; i++) { if(hang[i] == hang[lev]) return false; if(Math.abs(hang[i] - hang[lev]) == Math.abs(i-lev)) return false; } return true; } public static void bt(int lev) { if(lev == n) { answer++; return; } for(int i=0; i<n; i++) { hang[lev] = i; // hang[i] = lev가 아니다! lev행에 i를 다 넣어보는것 if(ck(lev)) // lev행 전까지 가보는 것 bt(lev+1); } } public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); arr = new int[n][n]; hang = new int[n]; bt(0); // 영층부터 가본다 System.out.println(answer); } }
- hang에 뭘 넣어줘야하는지 까먹지 말자! hang[lev] = i를 넣어주는 것!
4/6일자
-
조이스틱 - 프로그래머스 (Greedy)
⏲ 12:42 - 13:02 (20min)
package greeedy; public class prog_조이스틱_re { static public int solution(String name) { int answer = 0; int big = name.length()-1; for(int i=0; i<name.length(); i++) { char c = name.charAt(i); answer += Math.min('Z'-c+1, c-'A' -1); int next = i+1; while(next<name.length() && name.charAt(next) == 'A') next++; big = Math.min(big , i+i+name.length()-next); } return answer; } public static void main(String[] args) { } }
- 제일 많이 도는건 len-1까지이고 그것과 대적할 것은, 돌아서 a위치 전까지 가는걸 확인해보는 것!