반응형
05-16 06:23
Today
Total
«   2024/05   »
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
관리 메뉴

개발하는 고라니

[백준] 1034번 : 램프 본문

Programming/백준

[백준] 1034번 : 램프

조용한고라니 2021. 5. 10. 02:38
반응형
 

1034번: 램프

첫째 줄에 N과 M이 주어진다. N은 행의 개수이고, M은 열의 개수이다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 램프의 상태가 주어진다. 1이 켜져있는 상태이고, 0이 꺼져

www.acmicpc.net


이 문제를 보고 실제로 불을 껏다 켰다 할 생각을 하니 막막했었는데.. 그런 생각을 한 것 자체가 너무 1차원적이어서 다른 분의 풀이를 참고하였다. 역시나 스위치를 올렸다 내렸다 하는 일은 존재하지 않았고 패턴을 찾는 것이 관건이었다.

 

먼저 모든 행을 돌며 각 행에 포함된 0(off)의 개수를 센다. 당연히 0의 개수는 K보다 작거나 같아야 한다. 그 행의 불을 켜려면 0의 개수가 K개 보다 많으면 안되니 말이다.

 

그리고 이것이 중요한데 K가 짝수라면 0의 개수도 짝수이어야 하고, 홀수라면 0의 개수도 홀수여야한다. 각 전구는 On/Off 상태를 갖을 수 있는데, 스위치를 홀수번 키면 상태가 바뀌지만, 짝수번 키면 상태가 그대로 유지된다.

 

이 조건이 충족되었다면 다시 모든 행을 돌며 현재 행과 같은 행을 찾는다. 여기서 현재 행과 같다는 것은 0과 1의 위치와 개수가 모두 완벽히 일치하는 것 이다.

# Code </>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    static char[][] map = new char[51][51];

    static boolean isEqual(char[] arr1, char[] arr2, int m){

        for(int i=1; i<=m; i++)
            if(arr1[i] != arr2[i])
                return false;

        return true;
    }

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

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

        for(int i=1; i<=n; i++){
            char[] str = br.readLine().toCharArray();

            for(int j=1; j<=m; j++)
                map[i][j] = str[j-1];
        }

        int k = Integer.parseInt(br.readLine());
        int max = 0;

        /* 모든 행(Row)을 돌며 '0'의 개수 count */
        for(int i=1; i<=n; i++){

            int zero = 0;

            for(int j=1; j<=m; j++)
                if(map[i][j] == '0') zero++;

            int onRow = 0; //불이 켜진 행의 개수
            /* 0의 개수가 k이하 and 0의 개수, k가 모두 짝수? 홀수? */
            if(zero <= k && zero % 2 == k % 2){

                /* 현재 행(i)과 같은 행(같은 패턴)이 있으면 onRow 증가 */
                for(int j=1; j<=n; j++)
                    if(isEqual(map[i], map[j], m))
                        onRow++;

                max = Math.max(max, onRow);
            }

        }
        System.out.println(max);
    }
}

 

# Reference

공대생의 개발PATH님의 Tistory

반응형

'Programming > 백준' 카테고리의 다른 글

[백준] 5884번 : 감시 카메라  (0) 2021.05.11
[백준] 16441번 : 아기돼지와 늑대  (0) 2021.05.10
[백준] 9655번 : 돌 게임  (0) 2021.05.10
[백준] 16768번 : Mooyo Mooyo  (0) 2021.05.08
[백준] 17244번 : 아맞다우산  (0) 2021.05.06
Comments