백준 1034번 (램프, C++) [BAEKJOON]

목차 테이블

램프

https://www.acmicpc.net/problem/1034

시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초128 MB53042024165041.260%

문제

지민이는 각 칸마다 (1×1크기의 정사각형) 램프가 들어있는 직사각형 모양의 탁자를 샀다.

모든 램프는 켜져있거나 꺼져있다.

각 열의 아래에는 스위치가 하나씩 달려있는데, 이 스위치를 누를 때마다 그 열에 있는 램프의 상태가 바뀐다.

켜져있는 램프는 꺼지고, 꺼져있는 램프는 켜진다)

만약 어떤 행에 있는 램프가 모두 켜져있을 때, 그 행이 켜져있다고 말한다.

지민이는 스위치를 K번 누를 것이다. 서로다른 스위치 K개를 누르지 않아도 된다.

지민이는 스위치를 K번 눌러서 켜져있는 행을 최대로 하려고 한다.

지민이의 탁자에 있는 램프의 상태와 K가 주어졌을 때,

스위치를 K번 누른 후에 켜져있는 행의 최댓값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 M이 주어진다. N은 행의 개수이고, M은 열의 개수이다.

N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 램프의 상태가 주어진다.

1이 켜져있는 상태이고, 0이 꺼져있는 상태이다.

마지막 줄에는 K가 주어진다.

K는 1,000보다 작거나 같은 자연수 또는 0이다.

출력

첫째 줄에 문제의 정답을 출력한다.

예제 입력 1

3 2
01
10
10
1

예제 출력 1

2

예제 입력 2

1 6
101010
2

예제 출력 2

0

예제 입력 3

2 2
00
11
999

예제 출력 3

0

예제 입력 4

5 1
0
1
0
1
0
1000

예제 출력 4

2

예제 입력 5

14 3
001
101
001
000
111
001
101
111
110
000
111
010
110
001
6

예제 출력 5

4

예제 입력 6

5 2
01
10
01
01
10
1

예제 출력 6

3

출처

알고리즘 분류


통과된 코드

재귀를 이용한 BruteForce 알고리즘을 사용하여 테이블의 램프를 제어하는 방법으로 접근했으나 시간 초과로 통과하지 못하였다.

정답은 행에 램프가 꺼져있는 개수를 이용하여 푸는 방법

모든 행에서 K번 안에 모두 1로 바꿀 수 있는 행을 찾고 K가 짝수 홀수 인지에 대하여 확인한다.

만약 가능하다면 똑같은 행이 몇 개인지 확인하여 최댓값을 구한다.

#include <iostream>
#include <map>
using namespace std;

int _N, _M, _K, _Res = 0;
string _Table[50];
map<string, pair<int, int>> CheckMap;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> _N >> _M;
	for (int i = 0; i < _N; i++)
		cin >> _Table[i];
	cin >> _K;

	for (int i = 0; i < _N; i++) {
		int _cnt = 0;

		for (int j = 0; j < _M; j++)
			if (_Table[i][j] == '0')
				_cnt++;
		if (_cnt > _K) continue;
		auto it = CheckMap.find(_Table[i]);
		if (it != CheckMap.end()) it->second.second++;
		else CheckMap.insert({ _Table[i], {_cnt, 1}});
	}

	for (auto& it : CheckMap)
		if (it.second.first % 2 == _K % 2)
		   _Res = max(_Res, it.second.second);
		
	cout << _Res;
	return 0;
}

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤