Power Coding 파워 코딩

The Bomberman Game

Tags:

The Bomberman Game

풀이 핵심

  1. 각 시점별로 특징이 있고, 반복이 된다.
  2. 폭탄이 꽉차는 시점이라면 계산할 필요가 없다.
  3. 구석진 곳에서는 처음과 다른 케이스가 나올 수 있으니 주의.
  • 알고리즘이 어렵지 않는 문제.

Algorithm

  1. 1초 후 라면 그대로 리턴. (구할 필요가 없음)
  2. String -> char 변환 (편집 용이성)
  3. n초후를 조정한다. (특정 시점 이후 반복)
  4. n초후의 폭탄 상황에 대해 구한다.
  5. 마지막 상황 리턴

Source Code

import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

public class Solution {

    static final char bomb = 79;
    static final char blank = '.';
    static final char willBeBlank = '1';
    
    static boolean debugPrint = false;
            
    static int[][] afterOneSec(int[][] grid)
    {
        int[][] dir =
        {
            // i , j 
                {+1,+0},    // 상
                {-1,+0}, // 하
                {+0,-1}, // 좌
                {+0,+1}, // 우
        };
        
        for(int i = 0 ; i < grid.length ; i++)
        {
            for(int j = 0 ; j < grid[i].length ; j++)
            {
                if(grid[i][j] != -2)
                {
                    grid[i][j]++;
                }
                
                if(grid[i][j] == 3)
                {
                    grid[i][j] = -2;
                    for(int k = 0; k < dir.length ; k++)
                    {
                        int x = j + dir[k][1];
                        int y = i + dir[k][0];
                        
                        if( x < 0 || x >= grid[i].length) continue;
                        if( y < 0 || y >= grid.length) continue;
                        
                        if(grid[y][x] != 3 && grid[y][x] != 2)
                        grid[y][x] = -2;
                    }
                }
            }
        }
        
        for(int i = 0 ; i < grid.length ; i++)
        {
            for(int j = 0 ; j < grid[i].length ; j++)
            {
                if(grid[i][j] == -2)
                {
                    grid[i][j] = -1;
                }
                if(debugPrint)
                {
                    if(grid[i][j] == -1)
                    {
                        System.out.print(blank);
                    }
                    else
                    {
                        System.out.print(grid[i][j]);
                    }
                }
                
                
            }
            
            if(debugPrint)System.out.println();
        }
        
        
        return grid;
    }
    
    // Complete the bomberMan function below.
    static String[] bomberMan(int n, String[] grid) {
        
        if(n == 1) return grid;
        
        char[][] ch = new char[grid.length][];
        
        for(int i = 0 ; i < grid.length ; i++)
        {
            ch[i] = new char[grid[i].length()];
        }
        
        int[][] map = new int[grid.length][];        
        for(int i = 0 ; i < grid.length ; i++)
        {
            map[i] = new int [grid[i].length()];
        }
        
        for(int i = 0 ; i < grid.length ; i++)
        {
            for(int j = 0; j < grid[i].length() ; j++)
            {
                if(grid[i].charAt(j) == bomb)
                {
                    map[i][j] = 1;
                }
                else
                {
                    map[i][j] = -1;
                }
            }
        }
        
        if( n % 2 == 0)
        {
            n = 2;
        }
        else if(n == 3)
        {
            // do nothing
        }
        else if((n+3) % 4 == 0) // when 4k - 1 = n  where k = 2,3,4... => n = 5,9,11 
        {
            n = 5;
        }
        else
        {
            n = 7;
        }
        
        // 2. after n sec (after 2sec)
        for(int i = 0 ; i < n-1; i++)
        {
            if(debugPrint)System.out.println((i+2) + "sec");
            map = afterOneSec(map);
            if(debugPrint)System.out.println();
        }
        
        for(int i = 0 ; i < grid.length ; i++)
        {
            for(int j = 0; j < grid[i].length() ; j++)
            {
                if(map[i][j] == -1)
                {
                    ch[i][j] = blank;
                }
                else
                {
                    ch[i][j] = bomb;
                }
                
            }
        }  
        
        String[] returnGrid = new String[grid.length];
        
        for(int i = 0 ; i < returnGrid.length ; i++)
        {
            returnGrid[i] = new String(ch[i]);
        }
        
        return returnGrid;
    }

    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) throws IOException {
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

        String[] rcn = scanner.nextLine().split(" ");

        int r = Integer.parseInt(rcn[0]);

        int c = Integer.parseInt(rcn[1]);

        int n = Integer.parseInt(rcn[2]);

        String[] grid = new String[r];

        for (int i = 0; i < r; i++) {
            String gridItem = scanner.nextLine();
            grid[i] = gridItem;
        }

        String[] result = bomberMan(n, grid);

        for (int i = 0; i < result.length; i++) {
            bufferedWriter.write(result[i]);

            if (i != result.length - 1) {
                bufferedWriter.write("\n");
            }
        }

        bufferedWriter.newLine();

        bufferedWriter.close();

        scanner.close();
    }
}

The Grid Search

Tags:

The Grid Search

풀이 핵심

  1. 패턴을 인식하려면, 전체를 검색해서 맞는지 확인해야 한다.
  2. Java의 indexOf를 이용하면 쉽다. (해당 문자열의 시작 index 리턴).
  • 알고리즘이 어렵지 않은 문제.

Algorithm

  1. 비교 문자열의 첫번째 index를 구한다.
  2. -1이라면 없음 다음으로 이동
  3. 만약 찾았다면, 패턴이 모두 일치하는지 확인.
  4. 모두 일치 한다면 “YES”
  5. 전체 검색 후에도 일치하는 패턴이 없다면, “NO” 리턴

Source Code

import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

public class Solution {

     // Complete the gridSearch function below.
    static String gridSearch(String[] G, String[] P) {
        int idx = 0;
        
        
        for(int i = 0 ; i < G.length ; i++)
        {
            for(int j = 0 ; j <= G[i].length() - P[0].length(); j++)
            {
                int count = 1;
                idx = G[i].substring(j, G[i].length()).indexOf(P[0]); 
                
                //System.out.println(G[i].substring(j, G[i].length())+","+P[0]+"/"+idx);
                
                if(idx == -1) continue;
                for(int k = 1; k < P.length && ((i + k) < G.length) ; k++)
                {               
                    if (idx == G[i+k].substring(j, G[i].length()).indexOf(P[k])) count++;
                    else break;
                }
                
                // System.out.println(count);
                
                if(count == P.length)    return "YES";
                
            }
            // System.out.println();
            // System.out.println();
        }
        
        return "NO";
    }

    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) throws IOException {
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

        int t = scanner.nextInt();
        scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

        for (int tItr = 0; tItr < t; tItr++) {
            String[] RC = scanner.nextLine().split(" ");

            int R = Integer.parseInt(RC[0]);

            int C = Integer.parseInt(RC[1]);

            String[] G = new String[R];

            for (int i = 0; i < R; i++) {
                String GItem = scanner.nextLine();
                G[i] = GItem;
            }

            String[] rc = scanner.nextLine().split(" ");

            int r = Integer.parseInt(rc[0]);

            int c = Integer.parseInt(rc[1]);

            String[] P = new String[r];

            for (int i = 0; i < r; i++) {
                String PItem = scanner.nextLine();
                P[i] = PItem;
            }

            String result = gridSearch(G, P);

            bufferedWriter.write(result);
            bufferedWriter.newLine();
        }

        bufferedWriter.close();

        scanner.close();
    }
}

Even Tree

Tags:

Even Tree

풀이 핵심

  1. node의 탐색 방법으로는 DFS를 이용.
  2. node를 탐색하면서 짝수가 되는 부분을 자르면 Tree는 짝수가 됨.

Algorithm

  1. input으로 부터 tree를 구성한다. (Array List를 이용)
  2. dfs를 이용하여 노드를 탐색한다.
  3. 막다른 지점에서 다시 돌아오는 곳에서 부터 node의 길이를 count 한다.
  4. 만약 count 값이 짝수라면, 자르는 값 증가.
  5. 최종 입력이 무조건 짝수 이므로, 마지막 node까지 가게 되면 결과 값을 하나 더 하게 됨. 이때문에 마지막에 -1을 해줌.

Source Code

import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

public class Solution {
static ArrayList<Integer> tree[]; //  = new ArrayList[t_nodes];
    static boolean checked[];
    static int result;
    
    static int dfs(int start)
    {
        int count = 1;
        checked[start] = true;
        System.out.print(start + "->");
        
        for(int i = 0 ; i < tree[start].size() ; i++)
        {
            int next = tree[start].get(i);
            if(checked[next] == false)
            {
                count += dfs(next);
            }
        }
        
        // System.out.print(start);
        
        // if there is no another way to go, count
        System.out.print("("+count + ")");
        if(count % 2 == 0 )    // check even
        {
            System.out.println();            
            result++;
        }
        
        return count;
    }
    
    // Complete the evenForest function below.
    static int evenForest(int t_nodes, int t_edges, List<Integer> t_from, List<Integer> t_to) {
        tree = new ArrayList[t_nodes + 1];
        for(int i = 0 ; i < tree.length; i++)
        {
            tree[i] = new ArrayList<Integer>();
        }
        
        
        for(int i = 0 ; i < t_edges; i++)
        {
            int a = t_from.get(i);
            int b = t_to.get(i);
            
            tree[a].add(b);
            tree[b].add(a);
        }
        
        checked = new boolean[t_nodes + 1];
        result = 0;
        
        
        dfs(1);
        result--;
        return result;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

        String[] tNodesEdges = bufferedReader.readLine().replaceAll("\\s+$", "").split(" ");

        int tNodes = Integer.parseInt(tNodesEdges[0]);
        int tEdges = Integer.parseInt(tNodesEdges[1]);

        List<Integer> tFrom = new ArrayList<>();
        List<Integer> tTo = new ArrayList<>();

        for (int i = 0; i < tEdges; i++) {
            String[] tFromTo = bufferedReader.readLine().replaceAll("\\s+$", "").split(" ");

            tFrom.add(Integer.parseInt(tFromTo[0]));
            tTo.add(Integer.parseInt(tFromTo[1]));
        }

        int res = evenForest(tNodes, tEdges, tFrom, tTo);

        bufferedWriter.write(String.valueOf(res));
        bufferedWriter.newLine();

        bufferedReader.close();
        bufferedWriter.close();
    }
}

Bigger is Greater

Tags:

Bigger is Greater

풀이 핵심

입력의 바로 다음 큰 문자열을 잘 만들어 내는 것이 핵심.

Algorithm

  1. String 입력을 Integer로 변환 한다. (편의성을 위해)
  2. 바로 다음 수를 구한다.

다음수를 구하는 방법

ex) dabbcca

  1. 바뀌어야 되는 지점을 찾는다. (내림차순 순의 처음지점): dabbcca
  2. 바로 큰수와 교환 : dabbcca → daccba
  3. 바뀌어야 되는 지점이후 우측은 거꾸로 돌려준다. : dabccba → dabcabc

Source Code

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {
 
    static boolean getNextNum(int[] n)
    {
        boolean debugPrint = false;
        
        if(n.length == 1)   return false;
        
     
        // find position that will be changed
        int i = n.length - 1;
        if(debugPrint) System.out.print(i+"->");
        while((i-1>=0) && (n[i-1] >= n[i]))
        {
            i--;
        }        
        i--;
        if(debugPrint) System.out.println(i);
        
        if(i < 0)  return false;
        
        // find bigger number of n[i]
        int j = n.length - 1;
        while(n[i] >= n[j])
        {
            j--;
        }
        
        if(debugPrint) System.out.println(j);
        
        int temp = n[i];
        n[i] = n[j];
        n[j] = temp;
        
        j = n.length - 1;
        i++;
        while (i < j) {
            temp = n[i];
            n[i] = n[j];
            n[j] = temp;
            i++;
            j--;
        }
        
        return true;
    }
    
    
    static String biggerIsGreater(String w) {
        // Complete this function
        int[] wi = new int[w.length()];
        
        for(int i = 0 ; i < w.length() ; i++)
        {
            wi[i] = w.charAt(i) - 'a';
        }
        
        // next number
        if(getNextNum(wi) == false) return "no answer";
        else
        {
            char[] str = new char[wi.length];
            
            for(int i = 0 ; i < wi.length ; i++)
            {
               str[i] = (char)((char)wi[i] + 'a');
            }
            
            return new String(str,0,str.length);
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();
        for(int a0 = 0; a0 < T; a0++){
            String w = in.next();
            String result = biggerIsGreater(w);
            System.out.println(result);
        }
        in.close();
    }
}

Organizing Containers of Balls

Tags:

Organizing Containers of Balls

풀이 핵심

각 타입의 총 수와 각 컨테이너가 갖고 있는 ball의 총 수가 일치 해야 함.

ex)
Alt text

type 0번의 총 갯수가 1, container 0의 총 갯수는 2
type 1번의 총 갯수가 3, container 1의 총 갯수는 2

container의 0에 type 0을 다 swap해서 넣는다고 할때,
type 0은 1개만 있어서 container 0에서 총 담아야 하는 갯수는 1개이다.
하지만, container 0은 총 2개를 담고 있으므로, 절대 type 0만 담을 수 없다.

Algorithm

  1. type 별 총 갯수를 구한다. (각 행의 합)
  2. container가 갖고 있는 수를 구한다. (각 열의 합)
  3. 한쪽으로 각 타입을 몰아 넣는다. (정렬한다)
  4. 타입의 총 수와 conatainer의 총수가 일치 하는지 확인.

Source Code

import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;

public class Solution {

    static String organizingContainers(int[][] container) {
        // Complete this function
        boolean debugPrint = true;
        long[] sumRow = new long[container.length];
        long[] sumCol = new long[container[0].length];
       
        // sum col
        for(int i = 0 ; i < container.length ; i++)
        {
            for(int j = 0 ; j < container.length ; j++)
            {
                sumRow[i] += (long)container[i][j];
            }
        }
        
        // sum row
        for(int i = 0 ; i < container.length ; i++)
        {
            for(int j = 0 ; j < container.length ; j++)
            {
                sumCol[i] += (long)container[j][i];
            }
        }
        
        Arrays.sort(sumRow);
        Arrays.sort(sumCol);
        
        for(int i = 0 ; i < sumRow.length ; i++)
        {
            if(sumRow[i] != sumCol[i])  return "Impossible";    
        }
        
        
        return "Possible";
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int q = in.nextInt();
        for(int a0 = 0; a0 < q; a0++){
            int n = in.nextInt();
            int[][] container = new int[n][n];
            for(int container_i = 0; container_i < n; container_i++){
                for(int container_j = 0; container_j < n; container_j++){
                    container[container_i][container_j] = in.nextInt();
                }
            }
            String result = organizingContainers(container);
            System.out.println(result);
        }
        in.close();
    }
}