Post

[BaekJoon] 35296번 - 아침 점호 [Java][C++]

[BaekJoon] 35296번 - 아침 점호 [Java][C++]

문제 링크


1. 문제 풀이


주어진 출석표에서 출석 체크가 안된 학생은 자신의 출석과 자기 번호와 1 차이가 나면서 출석부 칸에서 인접한 학생까지 체크할 수 있다. 최소의 학생으로 출석을 전부해야하는데 이는 1번부터 출석을 안한 학생이면 자기 번호를 체크하고 다른 사람 번호도 체크할 수 있으면 최대한 체크하면 된다. 이때 자신 바로 아랫칸이 체크가 안됐으면 체크를 해주면 되며 출석부가 한 행으로만 구성되어 있으면 오른쪽 칸이 체크가 안됐으면 체크를 해주면 된다. 윗칸이나 왼쪽칸은 자신 이전의 누군가가 먼저 판단 대상이기 때문에 볼 필요가 없다.


2. 코드


1. 풀이 [Java]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        char[][] grid = new char[n][m];
        for (int i = 0; i < n; i++) {
            grid[i] = br.readLine().toCharArray();
        }

        int cnt = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid[i][j] == 'O') continue;

                if (i < n - 1 && grid[i + 1][j] == 'X') {
                    sb.append("2 ").append(i + 1 + n * j).append(" ").append(i + 2 + n * j).append("\n");
                    grid[i][j] = 'O';
                    grid[i + 1][j] = 'O';
                } else if (n == 1 && j < m - 1 && grid[i][j + 1] == 'X') {
                    sb.append("2 ").append(i + 1 + n * j).append(" ").append(i + 1 + n * (j + 1)).append("\n");
                    grid[i][j] = 'O';
                    grid[i][j + 1] = 'O';
                } else {
                    sb.append("1 ").append(i + 1 + n * j).append("\n");
                    grid[i][j] = 'O';
                }
                cnt++;
            }
        }

        System.out.println(cnt);
        System.out.println(sb);
    }
}


2. 풀이 [C++]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <bits/stdc++.h>
using namespace std;

const int MAX = 100;
char grid[101][101];

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, m;
    cin >> n >> m;

    for (int i = 0; i < n; i++) {
        cin >> grid[i];
    }

    int cnt = 0;
    string res;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (grid[i][j] == 'O') continue;

            if (i < n - 1 && grid[i + 1][j] == 'X') {
                res += "2 " + to_string(i + 1 + n * j) + " " + to_string(i + 2 + n * j) + "\n";
                grid[i][j] = 'O';
                grid[i + 1][j] = 'O';
            } else if (n == 1 && j < m - 1 && grid[i][j + 1] == 'X') {
                res += "2 " + to_string(i + 1 + n * j) + " " + to_string(i + 1 + n * (j + 1)) + "\n";
                grid[i][j] = 'O';
                grid[i][j + 1] = 'O';
            } else {
                res += "1 " + to_string(i + 1 + n * j) + "\n";
                grid[i][j] = 'O';
            }
            cnt++;
        }
    }

    cout << cnt << '\n';
    cout << res;
}

This post is licensed under CC BY 4.0 by the author.