2019 카카오 신입 공채 1차 - 오픈채팅방

문제 풀기 :  https://www.welcomekakao.com/learn/courses/30/lessons/42888 이 문제의 핵심은 uid이다. 하나의 uid에 하나의 닉네임이 매핑된다. 결국 마지막에 변경된 닉네임이 uid이 매핑된다. Change의 경우를 제외하고 Enter와 Leave의 경우만 한국 문자열로 대치하면서, uid에 매핑된 닉네임을 대입시키면 된다. import java.util.*; class Solution {     public String[] solution(String[] record) {         Map<String, String> users = new HashMap<>();         ArrayList<String> answer = new ArrayList<>();         int length = 0;         for (int i = 0; i < record.length; i++) {             String[] temp = record[i].split(" ");             if (temp.length > 2)                 users.put(temp[1], temp[2]);             if(!temp[0].equals("Change"))                 length++;   ...

백준 알고리즘 - 구슬탈출2

이 문제의 핵심은 어떤 구슬을 먼저 움직여 줄 지인 것 같다. 처음에 놓여진 빨간 구슬과 파란 구슬의 좌표값을 이용해서 우선순위 정해주기 #. . . RB.# 의 경우 왼쪽으로 굴리면 R부터 움직이고 B는 다음에 움직이고, 오른쪽으로 굴리면 B부터 굴리고 R을 다음에 굴린다. 구슬 이동 로직은 재귀를 이용해서 #을 만나거나 O 구멍을 만날 때 까지 계속 호출했다. 이 문제도 결국 최대 10번이다. 4의 10제곱의 경우의 수만 고려하면 된다. 1024 * 1024 는 100만이 조금 넘는다. 100만가지의 경우의 수를 검색해서 구슬이 탈출가능한 지 가능 하다면 최소 몇번만에 빠져가는지 구하면 된다. 하지만 100만가지를 다 검사하니 시간초과가 났다. 그래서 의미없는 움직임을 제외 시켜주니 통과됬다. 1. 같은 방향으로 연속해서 움직이는 경우 2. 왔던 방향으로 움직이는 경우 2가지만 제외해줘도 검사하는 경우의 수가 현저히 줄어든다. import java.util.HashSet; import java.util.Iterator; import java.util.Scanner; public class Main {     static class InObject {         int y;         int x;         int originY;         int originX;         String type;     }     private static HashSet<Integer> results = new HashSet<>();     public static void main(String[] args) {   ...

백준 알고리즘 - 2048 (Easy)

이 문제를 풀면서, 고생했던 점은 하나다. 위, 아래, 왼쪽, 오른쪽 각각 방향으로 블럭을 옮길 때의 로직 구현이었다. 처음에 구현 할 때 떨어져 있는 블럭의 케이스를 고려하지 않고 짜서, 뒤엎었다. ex) 2 0 0 2 4 의 경우 왼쪽으로 밀면 4 4 0 0 0 이 되어야 한다. 하지만 이 케이스를 고려하지 않아서 2 2 4 0 0 이 되었다. 그리고 두 번째 문제가 한 번 더했던 블럭은 두 번 이상 더하면 안되는데 더하는 케이스였다. ex) 2 2 0 4 0 의 경우 왼쪽으로 밀면 4 4 0 0 0 이 되어야 한다. 하지만 이 케이스를 고려하지 않아서 8 0 0 0 0 이 되었다. 이문제는 완전탐색이다. 최대 4이 5제곱 만큼 경우의 수를 돌리고 가장 큰 블록을 출력해주면 된다. import java.util.Scanner; public class Main {     static class Block{         int y;         int x;         int value;         int originValue;         boolean isSum;         public Block(int y, int x,int value) {             this.y = y;             this.x = x;             this.value = value;             this.originValue = value; ...

백준 알고리즘 - 퇴사

진짜 퇴사를 앞두고 퇴사 문제를 풀면서 느낌이 조금 달랐다. ㅋㅋㅋㅋ 이 문제도 DFS로 풀 수 있지만,  다른 사람이 푼 코드를 참고했다. 재귀로 풀었는데 DFS보다 연산의 횟수를 조금이나마 줄일 수 있었다. 하지만 이 문제를 DP로 푸는 사람도 보았는데, 아직까지 DP의 개념은 이해하지만 스스로 문제해결에 구현 하기에는 공부를 더 해야겠다고 생각했다. import java.util.Scanner; public class Main {     private static int result = 0;     public static void main(String[] args) {         Scanner scn = new Scanner(System.in);         int N = scn.nextInt();         int[] takenTime = new int[N];         int[] benefits = new int[N];         boolean[] isWork = new boolean[N];         boolean[] visited = new boolean[N];         for (int i = 0; i < N; i++) {             takenTime[i] = scn.nextInt();             benefits[i] = scn.nextInt();         }         scn.clos...

백분 알고리즘 - 연산자 끼워넣기

다행히도 연산할 때 우선순위가 없다. 무조건 앞쪽부터 차례대로 연산해서 고려 할게 줄었다. +-*/ 4가지의 개수를 String 배열에 담았다. 인풋이 2 1 2 1 이면 "+", "+", "-", "*", "*", "/" 그 후 DFS로 끝까지 탐색 할 때마다 연산하고 값을 HashSet에 담았다. 그리고 최소값, 최대값을 출력해 주었다. import java.util.HashSet; import java.util.Iterator; import java.util.Scanner; //+ - * / public class Main {     private static int max = 0;     private static int min = 0;     private static int[] sequence;     private static String[] operators;     private static boolean[] isVisit;     private static String[] resultOp;     private static HashSet<Integer> resultSet = new HashSet<>();     private static int[] resultArr = new int[2];     private static int oIdx = 0;     public static void main(String[] args) {         Scanner scn = new Scanner(System.in);         int numCnt = Integer.parseInt(scn.nextLine());   ...

백준 알고리즘 - 스타트와 링크

짝수의 플에이어 수를 받으면, 먼저 스타트팀과 링크팀으로 나눈다. 팀을 나눌 때 중복을 허용하지 않도록 짰다. ex) 4명 인 경우 스타트팀.   링크팀 1, 2.              3, 4 2,1.               4, 3 은 순서만 다를 뿐 멤버는 같기 때문에 중복이다. 팀을 선정 후 조합을 사용해서 능력치의 합을 구했다. 예전에 푼거라서 그런지.. 코드가 많이 지저분 하다..... 로직을 더 간단히 하고 중복되는 부분도 고쳐야 될 것같다.. 시간이 날 때 새로 풀어봐야겠다... import java.util.ArrayList; import java.util.Scanner; import java.util.Stack; public class Main {     private static int N;     private static int[][] S;     private static int[] allMember;     private static ArrayList<Integer> tempAllMember = new ArrayList<>();     private static boolean[] visited;     private static int[] beforeDividedTeam;     private static int[] startTeam;     private static int[] linkTeam;     private static boolean[] startVisited;     private static boolean[] linkVisited; ...

백준 알고리즘 - 감시

CCTV의 종류는 총 5개지만 종류마다 방향의 개수가 정해져있지만, 모두 4방향의 경우가 있다고 가정하고 문제를 접근했다. 물론 5번카메라 같은 경우는 방향이 1가지 이기 때문에 이 요소를 고려하고 짠다면, 불필요한 연산을 하지 않아도 된다. CCTV의 개수는 8개를 넘지 않는다고 하였다. 이 말은 4의 8제곱의 경우의 수를 넘지 않는다. DFS를 통해 탐색 후 CCTV가 감시하는 부분을 7로 채운 후 마지막의 0의 개수를 세어서 HashSet에 다가 넣어주었다. 그리고 다시 7로 채운 부분을 0으로 돌려주었다. 이 과정을 모든 경우의 수 만큼 반복했다. 모든 경우의 수를 검사하고 난 후 최소값을 출력해 주도록 짰다. import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Scanner; public class Main {     private static class CCTV{         int x;         int y;         int type;         boolean visited[];         public CCTV(int x, int y, int type) {             this.x = x;             this.y = y;             this.type = type;             this.visited = new boo...