[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을 빠져나가야 하는지는 상당히 의문…이다

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