[Coding test] 0425 4prob (java)

2020-04-29

Coding test / 0425

문제설명 (4문제)

map, dfs, 노가다, 년 관련 문제

유출 x

1번 풀이

package T0425;

import java.util.*;
public class t1 {
	
	static public int[] solution(String pur[]) {
		int answer[] = new int[5];
		int days[][] = new int[pur.length][3];
		int money[] = new int[pur.length];
		int ms[] = {31,28,31,30,31,30,31,31,30,31,30,31};
		int year[] = new int[366];
		
		for(int i=0; i<pur.length; i++) {
			String s[] = pur[i].split(" ");//s[0], s[1];
			String ss[] = s[0].split("/");
			for(int j=0; j<3; j++) {
				days[i][j] = Integer.valueOf(ss[j]);
			}
			money[i] = Integer.valueOf(s[1]);
		}
		
		for(int i=0; i<pur.length; i++) {
			int day = 0;	int realday = days[i][1];
			for(int j=0; j<realday-1; j++)
				day += ms[j];
			day += days[i][2];
			
			for(int j=day; j<day+30; j++)
				year[j] += money[i];
		}
		
		for(int i=1; i<366; i++) {
			if(year[i] <10000)
				answer[0]++;
			
			else if(year[i] <20000)
				answer[1]++;
			
			else if(year[i] <50000)
				answer[2]++;
			
			else if(year[i] <100000)
				answer[3]++;
			
			else
				answer[4]++;
		}
		
		
		return answer;
	}
	
	public static void main(String[] args) {
		String p[] = {"2019/01/01 5000","2019/01/20 15000","2019/02/09 90000"};
		int an[] = solution(p);
		
		for(int i=0; i<an.length; i++)
			System.out.print(an[i] + " ");
	}
}

후기 (–)

당시에는 너무 어렵게 생각함.. 달이 지나면 등급이 하나씩 떨어진다고 생각했다.

오늘 스터디를 진행하면서

  1. 며칠에 시작하든 30일간 값이 유지된다
  2. 365배열을 만들고 30일간 유지되는 값을 더해준다

라는 사실을 알게되었고 풀이를 안 이후에는 간단하게 해결!


2번 풀이

package T0425;

import java.util.*;
public class t2 {
	static public class Grade{
		String lang;
		int score;
		
		Grade(String lang, int score){
			this.lang = lang;
			this.score = score;
		}
	}
	
	public static int solution(String[] ip_addrs, String[] langs, int[] scores) {
	      HashMap<String, LinkedList<Grade>> map = new HashMap<>();
	      
	      for(int i=0; i<ip_addrs.length; i++) {
	    	  if(map.containsKey(ip_addrs[i])) {
	    		  LinkedList<Grade> inlist = map.get(ip_addrs[i]);
			      inlist.add(new Grade(langs[i], scores[i]));
		    	  
	    		  map.put(ip_addrs[i], inlist);
	    	  }
	    	  else {
	    		  LinkedList<Grade> list = new LinkedList<>();
			      list.add(new Grade(langs[i], scores[i]));
		    	  
	    		  map.put(ip_addrs[i], list);
	    	  }
	      }
	      
	      
	      int size = map.size();
	      for(int i=0; i<size; i++) {
	    	  LinkedList<Grade> g = map.get(ip_addrs[i]);
	    	  
	    	  if(g == null)
	    		  continue;
	    	  
	    	  if(g.size() >=4)
	    		  map.remove(ip_addrs[i]);
	    	  
	    	  else if(g.size() == 3) {
	    		  int num = 0;
		    	  for(int j=1; j<g.size(); j++) {
		    		  String s = g.get(0).lang;
		    		  if(s.contains("C")) {
		    			  if(g.get(j).lang.contains("C"))
		    				  num++;
		    		  }
		    		  else{
		    			  if(g.get(j).lang.equals(g.get(0).lang))
		    				  num++;
		    		  }
		    	  }
		    	  if(num == 2) {
		    		  map.remove(ip_addrs[i]);
		    	  }
	    	  }
	    	  

	    	  else if(g.size() == 2) {
	    		  int num = 0;
		    	  for(int j=1; j<g.size(); j++) {
		    		  String s = g.get(0).lang;
		    		  if(s.contains("C")) {
		    			  if(g.get(j).lang.contains(s) && g.get(j).score == g.get(0).score)
		    				  num++;
		    		  }
		    		  else{
		    			  if(g.get(j).lang.equals(g.get(0).lang) && g.get(j).score == g.get(0).score) {
		    				  num++;
		    			  }
		    		  }
		    	  }
		    	  if(num == 1) {
		    		  map.remove(ip_addrs[i]);
		    		 }
	    	  }
	    	  
	      }
	      
	      int answer = 0;
	      for(String s :map.keySet()) {
	    	  LinkedList<Grade> g = map.get(s);
	    	  //System.out.println("key는 "+ s);
	    	  answer += g.size();
	      }
	      
	      return answer;
	}

   
	
	public static void main(String[] args) {
      String ip[] = { "5.5.5.5", "155.123.124.111", "10.16.125.0", "155.123.124.111", "5.5.5.5", "155.123.124.111", "10.16.125.0", "10.16.125.0" };
      String lang[] = { "Java", "C++", "Python3", "C#", "Java", "C", "Python3", "JavaScript" };
      int score[] = { 294, 197, 373, 45, 294, 62, 373, 373 };

      String ip1[] = { "7.124.10.0", "7.124.10.0", "0.0.0.0", "7.124.10.0", "0.0.0.0", "7.124.10.0" };
      String lang1[] = { "C++", "Java", "C#", "C#", "C", "Python3" };
      int score1[] = { 314, 225, 45, 0, 155, 400 };

      System.out.println(solution(ip, lang, score));

   }
}

후기 (1h)

어렵게 풀려면 이렇게 쓰잘데기 없이 어렵게 풀 수도 있구나.. 를 느낀 문제!

  1. 사실 조건은 4개가 같을 때, 3개가 같을 때, 2개가 같을 때의 상황으로 나누어 봐주면 됐고
  2. 4개가 같을 때는 무조건 제거
  3. 3개가 같을 때는 1==2 ,2==3 인지 확인후 제거
  4. 2개가 같을 때는 first.language == sec.language && first.score == sec.score만 봐주면 되었다..

문제를 최대한 간단하게 이해하고 풀려는 노력이 필요하다!

물론, map안에 list쓰는 법을 익히며 좋은 공부가 된 문제였다


3번 풀이

package T0425;

import java.util.*;

public class t3 {
	static public String solution(String reg_list[], String new_id) {
		String answer = "";
		
		int idx = 0;
		for(int i=0; i<new_id.length(); i++) {
			char rc = new_id.charAt(i);
			if(rc == '1' || rc == '2'|| rc == '3' ||rc == '4'||rc == '5'||rc == '6'||rc == '7'||rc == '8'||rc == '9'||rc == '0'){
				idx = i;
				break;
			}
		}
			
		String s = ""; int find = 0;
		if(idx == 0)
			 s = new_id;
		else {
			s = new_id.substring(0,idx);
			find = Integer.parseInt(new_id.substring(idx, new_id.length()));
		}
		
		//일단 reg에 없으면 그값 return
		boolean b = false;
		for(int i=0; i<reg_list.length; i++) {
			if(new_id.equals(reg_list[i]))
				b = true;
		}
		if(b == false)
			return new_id;
		
		LinkedList<Integer> list = new LinkedList<>();
		for(int i=0; i<reg_list.length; i++) {
			if(s.equals(reg_list[i])) {
				list.add(0);
				continue;
			}
			
			int idxx = 0;
			for(int ii=0; ii<reg_list[i].length(); ii++) {
				char rc = reg_list[i].charAt(ii);
				if(rc == '1' || rc == '2'|| rc == '3' ||rc == '4'||rc == '5'||rc == '6'||rc == '7'||rc == '8'||rc == '9'||rc == '0'){
					idxx = ii;
					break;
				}
			}
			
			String ck = reg_list[i].substring(0, idxx);
			if(ck.equals(s))
					list.add(Integer.parseInt(reg_list[i].substring(idxx, reg_list[i].length())));
		}
		
		list.sort(null);
		
		for(int i=0; i<list.size(); i++) {
				if(find == list.get(i)) {
					find++;
					if(i==list.size()-1) {
						answer = s+ find;
					}
					continue;
				}
				else {
					answer = s + find;
					break;
				}
		}
		return answer;
	}
	
	public static void main(String[] args) {
		String s[] = {"card", "ace13", "ace16", "banker", "ace17", "ace14"};
		String ss[] = {"cow", "cow1","cow2","cow3", "cow4","cow9","cow8", "cow7","cow6","cow5"};
		String sss[] = {"bird99", "bird98", "bird101", "gotoxy"};
		String ssss[] = {"apple1", "orange", "banana3"};
		
		System.out.println(solution(s,"ace15"));
		System.out.println(solution(ss,"cow"));
		System.out.println(solution(sss,"bird98"));
		System.out.println(solution(ssss,"apple"));
	}
}

후기 (1h)

또한, 너무 어렵게 생각했다…

물론 숫자 전까지 구하는 idx를 찾아서 같으면 list에 넣어주기만 하면 됐지만…!

  1. 문제를 잘 읽어야 한다 -> 올바르지않은 s+n이 들어올 수도 있다 생각하고 시간낭비 함
  2. 따라서, 잘 읽고 올바른 s+n이 들어온다면
  3. 앞까지 끊어서 s==sss라면 뒤에 숫자를 list에 넣음
  4. 또한 뒤에 숫자가 없는 값이 오면 0 넣어줌


4번 풀이

package T0425;

import java.util.*;

public class t4 {
	static class Pos{
		int x;
		int y;
		Pos(int x, int y){
			this.x = x ;
			this.y = y;
		}
	}
	static int pan[][] = new int[7][7];
	static int dx[] = {1,-1,0,0};
	static int dy[] = {0,0,-1,1};
	
	static void push(int row, int color) {	
		for(int j=6; j>=1; j--) {
				if(pan[j][row] == 0) {
					pan[j][row] =color;
					break;
				}
			}
	}

	static void down() {	
		for(int k=1; k<7; k++) {
			for(int i=5; i>=1; i--) {
				for(int j=1; j<7; j++) {
					if(pan[i][j] !=0 && pan[i+1][j]==0) {
						pan[i+1][j] = pan[i][j];
						pan[i][j] = 0;
					}
				}
			}
		}
	}
	
	static LinkedList<Pos> list = new LinkedList<>();
	static void dfs(int x, int y, int color, boolean v[][]) {
		v[x][y] = true;
		list.add(new Pos(x,y));
		
		for(int i=0; i<4; i++) {
			int nx = x+dx[i];
			int ny = y+dy[i];
			
			if(nx>=1&& nx<7 && ny>=1&& ny<7 && pan[nx][ny] == color && !v[nx][ny])
				dfs(nx,ny,color,v);
		}
	}
	
	static public String[] solution(int mac[][]) {
		String answer[] = {"","","","","",""};
		
		int num = 0;
		while(num<100) {
			if(num < mac.length) {
				push(mac[num][0], mac[num][1]);
			}	
			
			//pan !=0
			for(int j=1; j<7;j++) {
				for(int k=1; k<7; k++) {
					if(pan[j][k] !=0) {
						list.clear();
						boolean v[][] = new boolean[7][7];
						dfs(j,k,pan[j][k],v);
					}
					
					if(list.size()>=3) {
						while(!list.isEmpty()) {
							Pos p =list.poll();
							pan[p.x][p.y] = 0;
						}
						
						down();
					}
				}
				
			}
			
			num++;
		}
		
		for(int i=1; i<7; i++) {
			for(int j=1; j<7;j++)
				answer[i-1] += String.valueOf(pan[i][j]);
		}
		
		return answer;
	}
	
	public static void main(String[] args) {
		//int mac[][] = { { 1, 1 }, { 2, 1 }, { 1, 2 }, { 3, 3 }, { 6, 4 }, { 3, 1 }, { 3, 3 }, { 3, 3 }, { 3, 4 },{ 2, 1 } };
		
		int mac[][] = { {1,1},{1,2},{1,4},{2,1},{2,2},{2,3},{3,4},{3,1},{3,2},{3,3},{ 3,4 }, { 4,4 }, { 4,3 }, { 5,4 }, { 6,1 } };
		
		
		String an[] = solution(mac);
		for(int i=0; i<6;i++)
			System.out.println(an[i]);
	}
	
}

후기 (1h)

푸는게 어려웠던건 아니지만 뿌요뿌요랑 이 문제를 통해서 터트리고 내리고 하는 문제는 완벽하게 익혔다!


다만, 아직도 언제 while을 빠져나가야 하는지는 상당히 의문…이다

시간적 여유가 있다면 느긋하게 풀겠지만, 다급한 상황에서는 여러 조건을 헷갈리고 틀리게 쓸 것 같은 느낌….!! 조심!

Read More

[백준] Puyo Puyo (java) Dfs

2020-04-28

Puyo Puyo (백준> Dfs_Bfs)

문제 링크

문제설명

뿌요뿌요의 룰은 다음과 같다.

필드에 여러 가지 색깔의 뿌요를 놓는다. 뿌요는 중력의 영향을 받아 아래에 바닥이나 다른 뿌요가 나올 때까지 아래로 떨어진다.

뿌요를 놓고 난 후, 같은 색 뿌요가 4개 이상 상하좌우로 연결되어 있으면 연결된 같은 색 뿌요들이 한꺼번에 없어진다.

뿌요들이 없어지고 나서 위에 다른 뿌요들이 있다면, 역시 중력의 영향을 받아 차례대로 아래로 떨어지게 된다.

아래로 떨어지고 나서 다시 같은 색의 뿌요들이 4개 이상 모이게 되면 또 터지게 되는데, 터진 후 뿌요들이 내려오고 다시 터짐을 반복할 때마다 1연쇄씩 늘어난다.

터질 수 있는 뿌요가 여러 그룹이 있다면 동시에 터져야 하고 여러 그룹이 터지더라도 한번의 연쇄가 추가된다.

남규는 최근 뿌요뿌요 게임에 푹 빠졌다. 이 게임은 1:1로 붙는 대전게임이라 잘 쌓는 것도 중요하지만, 상대방이 터뜨린다면 연쇄가 몇 번이 될지 바로 파악할 수 있는 능력도 필요하다. 하지만 아직 실력이 부족하여 남규는 자기 필드에만 신경 쓰기 바쁘다. 상대방의 필드가 주어졌을 때, 연쇄가 몇 번 연속으로 일어날지 계산하여 남규를 도와주자!

입력

12*6의 문자가 주어진다.

이때 .은 빈공간이고 .이 아닌것은 각각의 색깔의 뿌요를 나타낸다.

R은 빨강, G는 초록, B는 파랑, P는 보라, Y는 노랑이다.(모두 대문자로 주어진다.)

입력으로 주어지는 필드는 뿌요들이 전부 아래로 떨어진 뒤의 상태(즉 뿌요 아래에 빈 칸이 있는 경우는 없음) 이다.

출력

현재 주어진 상황에서 몇연쇄가 되는지 출력하라. (하나도 터지지 않는다면 0을 출력하면 된다.)

예제 입력 1 복사

......
......
......
......
......
......
......
......
.Y....
.YG...
RRYG..
RRYGG.

예제 출력 1 복사

3


풀이

package Dfs_Bfs;

import java.util.*;
public class beak_PuyoPuyo {
	
	static class Pos{
		int x;
		int y;
		Pos(int x, int y){
			this.x = x;
			this.y = y;
		}
	}
	
	static char pan[][];
	static int dx[] = {0,0,1,-1};
	static int dy[] = {1,-1,0,0};
	static LinkedList<Pos> qu = new LinkedList<>();
	
	static void dfs(int x, int y, char c, boolean v[][]) {
		//같은게 4개이상이면 .만들기
		v[x][y] = true;
		qu.add(new Pos(x,y));
		
		for(int i=0; i<4; i++) {
			int nx = x+ dx[i];
			int ny = y+ dy[i];
			
			if(nx>=0 &&nx<12 && ny>=0 && ny<6 && pan[nx][ny] == c && !v[nx][ny])
				dfs(nx,ny,c,v);	
		}//for
	}//dfs
	
	static void push() {		
		for(int k=0; k<12; k++) {
			for(int i=10; i>=0; i--) {
				for(int j=0; j<6; j++) {
					if(pan[i][j] !='.' && pan[i+1][j] == '.') {
						pan[i+1][j] = pan[i][j];
						pan[i][j] = '.';
					}
				}
			}
		}
	}//push
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		pan= new char[12][6];
		
		for(int i=0; i<12; i++) {
			String s = sc.nextLine();
			for(int j=0; j<6; j++)
				pan[i][j] = s.charAt(j);
		}//입력
		
		int serise = 0; // 답
		
		int k=0;
		while(k<72) {
			//네개 이상이 같으면 .만들고 ->serise = 1
			boolean visited[][] = new boolean[12][6];
			boolean chk = false;
			
			for(int i=0; i<12; i++) {
				for(int j=0; j<6; j++) {
					if(pan[i][j] !='.') {
						qu.clear();//초기화하고
						dfs(i,j, pan[i][j], visited);
						
						if(qu.size() >=4) {
							//qu에 있는거 다 빼서 .로 바꿔
							while(!qu.isEmpty()) {
								Pos p = qu.poll();
								pan[p.x][p.y] = '.';
							}
							chk = true;
						}
					}//if
				}
			}//for
			
			//내가 .가 아니고 && 내 밑이 존재하면서 && 밑이 .라면
			//끝까지밀기
			push();			
			
			if(chk == true)
				serise++;
			
			k++;
		}
		
		System.out.println(serise);
	}
}

후기 (1h)

오.. 생각보다 빨리풀음

  1. 우선 while을 어떻게 돌려줄까 생각하다가 사이즈는 12*6으로 정해져있어서 그거보단 크지않겠다 싶어서 72보다 작을때까지 도는 것으로 해줌 (어차피 4개이상 모여야 터지는거라 더 작은수로 해도되는데 생각이 안나서 그냥 제일 큰 사이즈로 넣어줌)

  2. 처음에는 마지막 줄만 돌면서 “.” 이 아니면 돌아주려고 했는데

    ....BB
       
    ....BB
       
    RRRRGG
       
    GGRRRR
    

    이 예시에서 맨위에 B*4도 한번의 연쇄에서 터트려줘야하기때문에 모든 루트를 다 돌았다

  3. 한번 터졌으면 push()함수 들어가서 내릴 수 있는 뿌요는 내려주고

  4. 연쇄를 한번 했으면 ++serise해준다

전체적인 틀은
1. 4개 이상 붙어있다면 다 터트려준다
2. 터트리고 밑으로 내릴거 있으면 내려준다
3. 한번이라도 터트렸으면 (+1 연쇄 인 것)
4. 계속 반복해준다
Read More

REAL 복습 (4) 신입사원/이동하기/보물섬/케빈 베이컨의 6단계 법칙

2020-04-24

REAL 복습 (4)

4/3일자, 3/31일자

  1. 신입사원 - 백준 1946 (Greedy)

    :timer_clock: 10:44 - 11:01 (17min)

    package greeedy;
       
    import java.util.*;
    public class beak_신입사원_re {
       
    	//10:44 - 11:01
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
       		
    		int n = sc.nextInt();
       		
    		for(int i=0; i<n; i++) {
    			int m = sc.nextInt();
    			int arr[][] = new int[m][2];
       			
    			for(int j=0; j<m; j++) {
    				arr[j][0] = sc.nextInt();
    				arr[j][1] = sc.nextInt();
    			}
       			
    			Arrays.sort(arr, new Comparator<int[]>() {
    				@Override
    				public int compare(int a[], int b[]) {
    					return a[0]-b[0];
    				}
    			});
       			
    			int answer = 1;
    			int min = arr[0][1];
       			
    			for(int j=1; j<m; j++) {
    				if(min > arr[j][1]) {
    					min = arr[j][1];
    					answer++;
    				}
    			}
       			
    			System.out.println(answer);
    		}
       		
    	}
    }
       
    
  2. 이동하기 - 백준 11048 (Greedy)

    ⏲ 11:08 - 11:28 (20min)

    package DP;
       
    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 arr[][] = new int[n+1][m+1];
       		
    		for(int i=1; i<=n; i++) {
    			for(int j=1; j<=m; j++)
    				arr[i][j] = sc.nextInt();
    		}
       		
    		for(int i=1; i<=n; i++) {
    			for(int j=1; j<=m; j++) {
    				if(i == 1)
    					arr[i][j] += arr[i][j-1];
       				
    				else if(j==1)
    					arr[i][j] += arr[i-1][j];
       				
    				else
    					arr[i][j] += Math.max(Math.max(arr[i-1][j-1], arr[i-1][j]),arr[i][j-1]);
    			}
    		}
       
    		int answer = Integer.MIN_VALUE;
    		for(int i=1; i<=m; i++) {
    			answer = Math.max(answer, arr[n][i]);
    		}
       		
    		System.out.println(answer);
    	}
    }
       
    
    • 오바잖아.. 이십분…
    • if, else if, else 일때의 조건을 확실히 걸어주어야 겹치지 않음!
    • 또 n+1 ,m+1로 할거면 기준 정확하게 잡아주기!
  3. 보물섬 - 백준 2589 (BFS)

    ⏲ 11:38 - 12:05 (28min)

    package Dfs_Bfs;
       
    import java.util.*;
    public class beak_보물섬_re {
    	static char arr[][];
    	static int n;
    	static int m;
       	
    	static class Pos{
    		int x;
    		int y;
    		int cnt;
    		Pos(int x, int y, int cnt){
    			this.x = x;
    			this.y = y;
    			this.cnt = cnt;
    		}
    	}
       	
    	static int dx[] = {0,0,1,-1};
    	static int dy[] = {1,-1,0,0};
       	
    	public static int bfs(int x, int y) {
    		int an=0;
    		boolean visited[][] = new boolean[n][m];
       		
    		Queue<Pos> qu = new LinkedList<>();
    		qu.add(new Pos(x,y,0));
    		visited[x][y] = true;
       		
    		while(!qu.isEmpty()) {
    			Pos p = qu.poll();
       			
    			for(int i=0; i<4; i++) {
    				int nx = p.x + dx[i];
    				int ny = p.y + dy[i];
       				
    				if(nx>=0&&nx<n&&ny>=0&&ny<m&&arr[nx][ny] == 'L' &&!visited[nx][ny]) {
    					visited[nx][ny] = true;
    					qu.add(new Pos(nx,ny,p.cnt+1));
    					an = Math.max(an, p.cnt+1);
    				}
    			}
       			
    		}
       		
    		return an;
    	}
       	
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
       		
    		n = sc.nextInt();
    		m = sc.nextInt();
       		
    		arr = new char[n][m];
       		
    		sc.nextLine();
       		
    		for(int i=0; i<n; i++) {
    			String a = sc.nextLine();
    			for(int j=0; j<m; j++) {
    				arr[i][j] = a.charAt(j);
    			}
    		}
    		int answer = 0;
       		
    		for(int i=0; i<n; i++) {
    			for(int j=0; j<m; j++) {
    				if(arr[i][j] == 'L') {
    					int temp = bfs(i,j);
    					answer = Math.max(answer, temp);
    				}
    			}
    		}
       		
    		System.out.println(answer);
       		
    	}
    }
    
    • 이 문제의 힌트는!!!!!!!!!!! ‘L’인 시작점 전부를 bfs를 타본다는 것이다!
  4. 케빈 베이컨의 6단계 법칙 - 백준 1389 (BFS)

    ⏲ 12:28 - 12:08 (40min)

    package Dfs_Bfs;
       
    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 arr[][] = new int[m][2];
       		
    		sc.nextLine();
       		
    		for(int i=0; i<m; i++) {
    			arr[i][0] = sc.nextInt();
    			arr[i][1] = sc.nextInt();
    		}
       		
    		int answer []= new int[n+1];
       		
    		for(int i=1; i<=n; i++) {
    			Queue<Integer> qu = new LinkedList<>();
    			boolean v[] = new boolean[n+1];
    			int sum[] = new int[n+1];
       			
    			qu.add(i);
    			v[i] = true;
       			
    			while(!qu.isEmpty()) {
    				int x = qu.poll();
       				
    				for(int j=0; j<m; j++) {
    					if(arr[j][0] == x && !v[arr[j][1]]) {
    						//걔까지는 갈수있으니까
    						qu.add(arr[j][1]);
    						v[arr[j][1]] = true;
    						sum[arr[j][1]] += sum[arr[j][0]] +1;
    					}
       					
    					if(arr[j][1] == x && !v[arr[j][0]]) {
    						//걔까지는 갈수있으니까
    						qu.add(arr[j][0]);
    						v[arr[j][0]] = true;
    						sum[arr[j][0]] += sum[arr[j][1]] +1;
    					}
    				}
       				
    			}//while
       			
    			for(int k:sum) {
    				answer[i] += k;
    			}	
    		}
       		
    		int idx = 0;
    		int real = answer[n];
    		for(int i=n-1; i>=1; i--) {
    			if(real>=answer[i]) {
    				real = answer[i];
    				idx = i;
    			}
    		}
       	
    		System.out.println(idx);
    	}
    }
    
    • 아 어렵다..
    • 힌트!!!!
    • 1부터 n까지 돌리면서 qu와 sum[], v[]를 매번 생성한다**
    • qu.add(x)가지고 들어갔으면 1. 안방문했던 곳이며 2.x 의 친구라면
    • x가 가지는 위치 +1을 해주고, true를 해주면서 들어간다
    • 이 포인트만 기억하면 금방 풀 수 있다!
Read More

REAL 복습 (3) 빙산/기타줄/N-Queen/조이스틱

2020-04-22

REAL 복습 (3)

4/8일자, 4/18일자

  1. 빙산 - 백준 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
  2. 기타줄 - 백준 (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 낱개를 일단 구해놓는 것!
      1. 패키지로만 전부살건지
      2. 낱개로만 전부 살건지
      3. 패키지로 사고 + 나머지를 낱개로 살건지
  3. 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일자

  1. 조이스틱 - 프로그래머스 (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위치 전까지 가는걸 확인해보는 것!
Read More

REAL 복습 (2) 암호 만들기/덩치/보물/짝지어 제거하기/여행경로/욕심쟁이 판다

2020-04-21

REAL 복습 (2)

4/7일자

  1. 암호 만들기 - 백준 1759 (Backtracking)

    :timer_clock: 10:46 - 11:22 (32min)

    package Backtracking;
       
    import java.util.*;
    public class back_암호만들기 {
    	static int n;
    	static int m;
    	static LinkedList<String> arr;
    	static LinkedList<String> list;
    	static LinkedList<String> result;
       	
    	public static int vo(String s) {
    		int num = 0;
    		String v = "aeiou";
    		for(int i=0; i<s.length(); i++) {
    			if(v.contains(String.valueOf(s.charAt(i))))
    					num++;
    		}
    		return num;
    	}
       	
    	//mCn
    	public static void Combination(int num) {
    		if(num == n) {
    			String a = "";
    			for(String s : result) {
    				a +=s;
    			}
    			int numb=vo(a);
    			if(numb>=1 && n-numb>=2)
    				list.add(a);
       				
    			return;
    		}
    		else {
    			for(int i=0; i<arr.size(); i++) {
    				if(result.contains(arr.get(i)))
    					continue;
    				//result가 empty가 아닐때!!
    				if(!result.isEmpty() && i<=arr.indexOf((result.getLast())))
    					continue;
       				
    				result.add(arr.get(i));
    				Combination(num+1);
    				result.removeLast();
    			}
    		}
    	}
       	
       	
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
       		
    		n = sc.nextInt();
    		m = sc.nextInt();
    		sc.nextLine();
       		
    		list = new LinkedList<>();
    		result = new LinkedList<>();
    		arr = new LinkedList<>();
       		
    		String s[] = sc.nextLine().split(" ");
       		
    		for(int i=0; i<m; i++) 
    			arr.add(s[i]);
       		
    		//미리 정렬한다! (조합으로 풀면 정렬순서가 섞일일이 없다)
    		arr.sort(null);
    		//mCn으로 구할 수 있는 string 전부 구한다
    		Combination(0);
    		//다 구하면  1.최소한개의 모음 2.최소 두개의 자음으로 구성인지
       		
    		for(int i=0; i<list.size(); i++)
    			System.out.println(list.get(i));
    	}
    }
       
    
    • 풀기는 금방 풀었는데, 런타임에러가 계속 났다


  1. 덩치 - 백준 1768 (BruteForce)

    ⏲ 11:32 - 11:42 (10min)

    package bruteforce;
       
    import java.util.*;
       
    public class beak_덩치 {
       	
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		int n = sc.nextInt();
       		
    		int arr[][] = new int[n][2];
    		for(int i=0 ;i<n; i++) {
    			arr[i][0] = sc.nextInt();
    			arr[i][1] = sc.nextInt();
    		}
       		
    		int d[] = new int[n];
       		
    		for(int i=0; i<n; i++) {
    			for(int j=0; j<n; j++) {
    				if( i == j)
    					continue;
    				if(arr[i][0]<arr[j][0] && arr[i][1] < arr[j][1])
    					d[i]++;	
    			}
    		}
       		
    		for(int i=0; i<d.length; i++)
    			System.out.print((d[i]+1) + " ");
    	}
       	
    }
       
    
    • 생각보다 문제푸는 법이 곰방 생각남
  2. 보물 - 백준 1026 (Sort)

    ⏲ 12:00 - 12:05 (5min)

    package Sort;
       
    import java.util.*;
    public class beak_re_보물 {
       
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
       		
    		int n = sc.nextInt();
       		
    		int a[] = new int[n];
    		int b[] = new int[n];
       		
    		for(int i=0; i<n; i++) {
    			a[i] = sc.nextInt();
    		}
    		for(int i=0; i<n; i++) {
    			b[i] = sc.nextInt();
    		}
       		
    		Arrays.sort(a);
    		Arrays.sort(b);
       		
    		int answer = 0;
    		for(int i=0; i<n; i++) {
    			answer += a[i] * b[n-i];
    		}
       		
    		System.out.println(answer);
    	}
    }
       
    
    • 이것도! 쉽게 풀어야하는 문제
  3. 짝지어 제거하기 - 백준 1026 (Sort)

    ⏲ 12:10 - 12:20 (10min)

    package Stack_Queue;
       
    import java.util.*;
    public class prog_짝지어제거하기 {
       
    	public int solution(String s) {
    		int answer = 0;
       		
    		Stack<Character> stk = new Stack<>();
       		
    		for(int i= s.length()-1; i>=0; i--) {
    			char c = s.charAt(i);
    			if(!stk.isEmpty() && stk.peek() == c)
    				stk.pop();
    			else
    				stk.push(c);
    		}
       		
    		if(stk.isEmpty())
    			answer = 1;
       		
    		return answer;
    	}
    }
       
    
    • 한 삼분 버벅이다가, 금방 풀음
  4. 여행 경로 - 프로그래머스 43164 (Dfs)

    ⏲ 12:30 - 12:50 (20min)

    package Dfs_Bfs;
       
    import java.util.*;
       
    public class prog_re_여행경로 {
    	static String tic[][];
    	static int n;
    	static LinkedList<String> list;
       	
    	static public void dfs(int idx, boolean visited[], int num, String s) {
    		String next = tic[idx][1];
    		s = s + next + ",";
       		
    		if(num == n) {
    			list.add(s);
    			return;
    		}
       
    		for(int i=0; i<tic.length; i++) {
    			if(tic[i][0].equals(next) && !visited[i]) {
                    visited[i] = true;
    				dfs(i,visited,num+1, s);
    				//까먹지 말기
                    visited[i] = false;
    			}
    		}
       		
    	}
       	
    	static public String[] solution(String[][] tickets) {
    		tic = tickets;
    		n = tickets.length;
       		
    		list = new LinkedList<>();
       		
    		for(int i=0; i<tickets.length; i++) {
    			boolean visited[] = new boolean[tickets.length];
    			if(tickets[i][0].equals("ICN")) {
    				visited[i] = true;
    				dfs(i ,visited,1, "ICN,");
    			}
    		}
               
    		list.sort(null);
               
    		String s[] = list.get(0).split(",");
       		
    		return s;
    	}
       	
    }
       
    
    • ”,” 찍어 주는거 잊지말자!
  5. 욕심쟁이 판다 - 백준 1937 (DP)

    ⏲ 13:13 - 12:53 (40min)

    package DP;
       
    import java.util.*;
    public class beak_re_욕심쟁이판다 {
       
    	static int maze[][];
    	static int root[][];
    	static int n;
    	static int dx[] = {0,0,1,-1};
    	static int dy[] = {1,-1,0,0};
       	
    	static public int backt(int x, int y) {
    		if(root[x][y] !=0)
    			return root[x][y];
    		//그게 아니라면 일단 1 넣어 줌
    		root[x][y] = 1;
       		
    		for(int i=0; i<4; i++) {
    			int nx = x+dx[i];
    			int ny = y+dy[i];
       			
    			if(nx>=0 && nx<n && ny>=0 && ny<n) {
    				if(maze[x][y] <maze[nx][ny]) {
    					root[x][y] = Math.max(backt(nx,ny) + 1, root[x][y]);
    				}
    			}
    		}
       		
    		return root[x][y];
    	}
       	
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
       		
    		n = sc.nextInt();
       		
    		maze = new int[n][n];
    		root = new int[n][n];
       		
    		for(int i=0; i<n; i++) {
    			for(int j=0; j<n; j++) {
    				maze[i][j] = sc.nextInt();
    			}
    		}
       		
    		for(int i=0; i<n; i++) {
    			for(int j=0; j<n; j++) {
    				if(root[i][j] ==0)
    					backt(i,j);
    			}
    		}
       		
    		int max = 0;
       		
    		for(int i=0; i<n; i++) {
    			for(int j=0; j<n; j++) {
    				max = Math.max(max, root[i][j]);
    			}
    		}
       		
    		System.out.println(max);
    	}
    }
       
    
    • 오 못풀 줄 알았는데 풀었따… 싱기방기..
    • 메모이제이션으로 풀었따!
Read More