본문 바로가기

Algorithm/CodeUp

[CodeUp_Java] Q1098 : [기초-2차원배열] 설탕과자 뽑기

반응형

안녕하세요! Plitche(플리체)입니다.
이번 포스팅의 주제는 Q1098 : [기초-2차원배열] 설탕과자 뽑기 (자바, JAVA)입니다.

intro

Question

문제 설명

입력

첫 줄에 격자판의 세로(h), 가로(w) 가 공백을 두고 입력되고,
두 번째 줄에 놓을 수 있는 막대의 개수(n)
세 번째 줄부터 각 막대의 길이(l), 방향(d), 좌표(x, y)가 입력된다.

입력값의 정의역은 다음과 같다.

1 <= w, h <= 100
1 <= n <= 10
d = 0 or 1
1 <= x <= 100-h
1 <= y <= 100-w

출력

모든 막대를 놓은 격자판의 상태를 출력한다.
막대에 의해 가려진 경우 1, 아닌 경우 0으로 출력한다.
단, 각 숫자는 공백으로 구분하여 출력한다.

예시

  • 입력 :
    5 5
    3
    2 0 1 1
    3 1 2 3
    4 1 2 5
  • 출력 :
    1 1 0 0 0
    0 0 1 0 1
    0 0 1 0 1
    0 0 1 0 1
    0 0 0 0 1

Solution (풀이)

  • 풀이 1 : 메모리 14460, 시간 111
public class Answer1 {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int w = sc.nextInt();    // 격자판 가로 길이
        int h = sc.nextInt();    // 격자판 세로 길이

        int[][] board = new int[w][h];    // 입력받은 격자판 크기만큼 배열 크기 지정

        int n = sc.nextInt();    // 막대의 개수
        // 막대의 속성 막대의 개수만큼 배열 길이 지정
        int[] i = new int[n];    
        int[] d = new int[n];    
        int[] x = new int[n];    
        int[] y = new int[n];    

        for (int j=0; j<n; j++) {    // 막대의 개수만큼 for문 반복
            i[j] = sc.nextInt();    // 막대의 길이
            d[j] = sc.nextInt();    // 막대의 방향
            x[j] = sc.nextInt()-1;    // 가로 좌표
            y[j] = sc.nextInt()-1;    // 세로 좌표
        }

        for (int j=0; j<n; j++) {    // 막대의 개수만큼 for문 반복
            for (int k=0; k<i[j]; k++) {    //막대의 길이만큼 for문 반복
                if (d[j]==0) {    // 막대를 놓는 방향이 가로일 때
                    board[x[j]][y[j]+k] = 1;
                } else {    // 막대를 놓는 방향이 세로일 때
                    board[x[j]+k][y[j]] = 1;
                }
            }
        }

        for (int j=0; j<w; j++) {
            for (int k=0; k<h; k++) {
                System.out.print(board[j][k] + " ");    // 해당 격자판 값 출력
            }
            System.out.println();    // 줄 바꿈
        }
        sc.close();
    }
}
  • 풀이 2 : 메모리 11268, 시간 61
public class Answer2 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        // 입력받은 격자판 크기만큼 배열 크기 지정
        int[][] board = new int[Integer.parseInt(st.nextToken())][Integer.parseInt(st.nextToken())];

        int n = Integer.parseInt(br.readLine()); // 막대의 개수
        for (int j=0; j<n; j++) {
            StringTokenizer st2 = new StringTokenizer(br.readLine(), " ");
            int i = Integer.parseInt(st2.nextToken());    // 막대의 길이
            int d = Integer.parseInt(st2.nextToken());    // 막대의 방향
            int x = Integer.parseInt(st2.nextToken())-1;    // 가로 좌표
            int y = Integer.parseInt(st2.nextToken())-1;    // 세로 좌표

            if (d==0) {    // 막대를 놓는 방향이 가로일 때
                for (int k=0; k<i; k++) {    //막대의 길이만큼 for문 반복
                    board[x][y+k] = 1;    // 해당 좌표 1로 저장
                }
            } else {    // 막대를 놓는 방향이 세로 일 때
                for (int k=0; k<i; k++) {        //막대의 길이만큼 for문 반복
                    board[x+k][y] = 1;    // 해당 좌표 1로 저장
                }
            }

        }
        StringBuilder sb = new StringBuilder();
        for (int[] i : board) {    // 2중 foreach문 활용
            for (int j : i) {
                sb.append(j).append(" ");
            }
            sb.append("\n");
        }

        System.out.print(sb);
        br.close();
    }
}

Ranking(순위)

반응형