[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] + " ");
}
}
후기 (–)
당시에는 너무 어렵게 생각함.. 달이 지나면 등급이 하나씩 떨어진다고 생각했다.
오늘 스터디를 진행하면서
- 며칠에 시작하든 30일간 값이 유지된다
- 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)
어렵게 풀려면 이렇게 쓰잘데기 없이 어렵게 풀 수도 있구나.. 를 느낀 문제!
- 사실 조건은 4개가 같을 때, 3개가 같을 때, 2개가 같을 때의 상황으로 나누어 봐주면 됐고
- 4개가 같을 때는 무조건 제거
- 3개가 같을 때는 1==2 ,2==3 인지 확인후 제거
- 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에 넣어주기만 하면 됐지만…!
- 문제를 잘 읽어야 한다 -> 올바르지않은 s+n이 들어올 수도 있다 생각하고 시간낭비 함
- 따라서, 잘 읽고 올바른 s+n이 들어온다면
- 앞까지 끊어서 s==sss라면 뒤에 숫자를 list에 넣음
- 또한 뒤에 숫자가 없는 값이 오면 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을 빠져나가야 하는지는 상당히 의문…이다
시간적 여유가 있다면 느긋하게 풀겠지만, 다급한 상황에서는 여러 조건을 헷갈리고 틀리게 쓸 것 같은 느낌….!! 조심!