ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 구름톤 챌린지: 2주차(230823~230825)
    구름톤 챌린지 2023. 8. 24. 13:48

    230823

    Day8 문제풀이

    코드

    import java.io.*;
    class Main {
        public static void main(String[] args) throws Exception {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
            int N = Integer.parseInt(br.readLine());
    
            int countItem = 0;
            countItem += (N / 14);
            N %= 14;
            countItem += (N / 7);
            countItem += N % 7;
    
            System.out.println(countItem);
        }
    }

    중요

    • 그리디 알고리즘 : 선택을 해야 할 때마다 눈앞의 최선의 선택을 하는 알고리즘. 너무 많은 반복이 필요한 동적 프로그래밍을 보완하기 위한 알고리즘.

    230824

    Day9 문제풀이

    코드

    import java.io.*;
    import java.util.*;
    
    class Main {
        public static void main(String[] args) throws Exception {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
            StringTokenizer tk = new StringTokenizer(br.readLine());
            int N = Integer.parseInt(tk.nextToken());
            int K = Integer.parseInt(tk.nextToken());
    
            String[][] ground = new String[N][N];
            int[][] point = new int[N][N];
            for(int i=0; i<N; i++) {
                tk = new StringTokenizer(br.readLine());
                for(int j=0; j<N; j++) {
                    ground[i][j] = tk.nextToken();
                }
            }
    
            int max = 0;
            int[][] area = {{1,0}, {0,-1}, {0,0}, {0,1}, {-1,0}};
            for(int k=0; k<K; k++) {
                tk = new StringTokenizer(br.readLine());
                int Y = Integer.parseInt(tk.nextToken()) - 1;
                int X = Integer.parseInt(tk.nextToken()) - 1;
    
                for(int l=0; l<area.length; l++) {
                    try {
                        if(ground[Y+area[l][0]][X+area[l][1]].equals("0")) point[Y+area[l][0]][X+area[l][1]]++;
                        else if(ground[Y+area[l][0]][X+area[l][1]].equals("@")) point[Y+area[l][0]][X+area[l][1]] += 2;
    
                        if(max < point[Y+area[l][0]][X+area[l][1]]) max = point[Y+area[l][0]][X+area[l][1]];
                    } catch(Exception e) {} 
                }
            }
    
            System.out.print(max);
        }
    }

    중요

    • 완전 탐색 알고리즘 : 모든 경우의 수를 체크하는 방법
    • 코드 자체의 가독성만 본다면 이차원 배열이 낫지만, 일차원 배열을 사용하면 속도와 성능 면에서 조금 더 개선될 수 있다고 한다.
      지금은 데이터의 양이 적지만 방대한 양의 자료를 사용해야 할 땐 일차원 배열을 고려해봐도 좋을 듯 하다.

    230825

    Day10 문제풀이

    코드

    import java.io.*;
    import java.util.*;
    
    class Main {
        public static void main(String[] args) throws Exception {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
            int N = Integer.parseInt(br.readLine());
            String[] temp = br.readLine().split(" ");
            int[] goorm = {Integer.parseInt(temp[0]) - 1, Integer.parseInt(temp[1]) - 1};
            temp = br.readLine().split(" ");
            int[] player = {Integer.parseInt(temp[0]) - 1, Integer.parseInt(temp[1]) - 1};
    
            boolean[][] visitGoorm = new boolean[N][N];
            boolean[][] visitPlayer = new boolean[N][N];
    
            String[][] board = new String[N][N];
            for(int i=0; i<N; i++) {
                StringTokenizer tk = new StringTokenizer(br.readLine());
                for(int j=0; j<N; j++) {
                    board[i][j] = tk.nextToken();
                }
            }
    
            visitGoorm[goorm[0]][goorm[1]] = true;
            visitPlayer[player[0]][player[1]] = true;
            int pointGoorm = playGame(board, visitGoorm, goorm, N);
            int pointPlayer = playGame(board, visitPlayer, player, N);
    
            if(pointGoorm > pointPlayer) System.out.print("goorm " + pointGoorm);
            else System.out.print("player " + pointPlayer);
        }
    
        public static int playGame(String[][] board, boolean[][] visit, int[] user, int N) {
            boolean isBreak = false;
            while(true) {
                if(isBreak) break;
    
                String[] go = new String[2];
                go[0] = board[user[0]][user[1]].substring(0, board[user[0]][user[1]].length()-1);
                go[1] = String.valueOf(board[user[0]][user[1]].charAt(board[user[0]][user[1]].length()-1));
    
                if(go[1].equals("L")) {
                    for(int i=0; i<Integer.parseInt(go[0]); i++) {
                        user[1]--;
                        if(user[1] < 0) user[1] = N-1;
    
                        if(visit[user[0]][user[1]]) {
                            isBreak = true;
                            break;
                        }
    
                        //방문처리
                        if(!visit[user[0]][user[1]]) visit[user[0]][user[1]] = true;
                    }
                } else if(go[1].equals("R")) {
                    for(int i=0; i<Integer.parseInt(go[0]); i++) {
                        user[1]++;
                        if(user[1] > N-1) user[1] = 0;
    
                        if(visit[user[0]][user[1]]) {
                            isBreak = true;
                            break;
                        }
    
                        //방문처리
                        if(!visit[user[0]][user[1]]) visit[user[0]][user[1]] = true;
                    }
                } else if(go[1].equals("U")) {
                    for(int i=0; i<Integer.parseInt(go[0]); i++) {
                        user[0]--;
                        if(user[0] < 0) user[0] = N-1;
    
                        if(visit[user[0]][user[1]]) {
                            isBreak = true;
                            break;
                        }
    
                        //방문처리
                        if(!visit[user[0]][user[1]]) visit[user[0]][user[1]] = true;
                    }
                } else {
                    for(int i=0; i<Integer.parseInt(go[0]); i++) {
                        user[0]++;
                        if(user[0] > N-1) user[0] = 0;
    
                        if(visit[user[0]][user[1]]) {
                            isBreak = true;
                            break;
                        }
    
                        //방문처리
                        if(!visit[user[0]][user[1]]) visit[user[0]][user[1]] = true;
                    }
                }
            }
    
            int point = 0;
            for(int i=0; i<N; i++) {
                for(int j=0; j<N; j++) {
                    if(visit[i][j]) point++;
                }
            }
            return point;
        }
    }

    중요

    • 1L을 1 L 로 분할하는 것은 좋았으나, 무턱대고 글자대로 자르다보니 103L이 103 L 이 아닌 1 0 3 L로 분할되는 문제가 발생하였고 이를 파악하는 것이 늦어 시간을 많이 잡아먹었다.
      앞으로 split으로 분할할 때 내가 원하는 대로 분할한 것이 맞는지 다시 한 번 생각해봐야겠다.
Designed by Tistory.