1034 - 램프

2022. 1. 24. 01:04· PS - BOJ
목차
  1. 1034

1034

램프

  • 행과 열, N,M 입력받음.
  • 각 칸에는 램프가 있고, 1은 켜짐 0은 꺼짐.
  • 그 상태를 N개의 0과1로 이루어진 문자열로 입력받음.
  • 스위치를 누르면 전체 열의 켜짐/꺼짐 상태가 반전됨.
  • 그 스위치를 누를 횟수 K를 입력받음.
  • K회의 입력 후 전부 다 켜진 행의 최댓값을 출력.
import java.util.Scanner;

public class bj1034_0123 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		// 입력
		int N = sc.nextInt();
		int M = sc.nextInt();
		String[] arr = new String[N];

		for (int i = 0; i < N; i++)
			arr[i] = sc.next();
		int K = sc.nextInt();
		sc.close();

		// 입력 분석

		// 1. sameRow 배열 선언, 초기화
		// - 똑같은 행들을 찾아서 개수를 기록하는 배열
		// - ex) 1행2행이 같고 3행4행이 같고 5행은 혼자라면
		// [2, 0, 2, 0, 1]이 됨.
		int[] sameRow = new int[N];
		for (int i = 0; i < N; i++) { // 우선 1로 초기화하고,
			sameRow[i] = 1;
		}
		for (int i = 0; i < N; i++) { // 입력 배열의 각 i번 행에 대해서,
			if (sameRow[i] != 0) {
				for (int j = i + 1; j < N; j++) { // j번 행과 같은지 검사하고,
					if (arr[i].equals(arr[j]) == true) {
						sameRow[i]++; // 같다면 sameRow에 추가해주고,
						sameRow[j] = 0; // 그 같게된 대상은 이제 카운팅 안한단 의미로 0. 그래서 4줄 위 if가 있는 것임.
					}
				}
			}
		}

		// 2. cnt0 배열
		// - sameRow에서 0 아닌 인덱스별로 각 행에 0이 몇개인지 받는 배열
		// - 각 행별로 0이 몇개있는지 알아야 몇 번 스위치를 눌러야 하는지 알 수 있기 때문.
		int[] cnt0 = new int[N];
		for (int i = 0; i < N; i++) {
			if (sameRow[i] != 0) { // sameRow 만들 때 0은 카운팅하지 않기로 했기 때문.
				for (int j = 0; j < M; j++) {
					if (arr[i].charAt(j) == '0') {
						cnt0[i]++; // 결과적으로, 세야하는 행에 대해서만 0이 몇개인지 세서 cnt0배열에 넣기.
					}
				}
			}
		}

		// 3. K가 유효한지 검사, 동시에 몇줄 켜지는지 최대값 세기.
		// - 앞서 cnt0이 핵심이고,
		// - cnt0가 가리키는 어떤 행의 0 개수보다 K가 작다면, 그 행은 절대 다 킬 수 없음.
		// - 똑같다면, 딱 다 킬 수 있음. (카운트)
		// - K가 더 크면서, 그 차이가 짝수여야 가능. (카운트) (아래에서 tmp변수가 그 차이)
		// - - 홀수라면 불필요한 스위치 조작 때문에 불이 꺼짐. 짝수면 임의의 열 껐다키기.
		int max = 0;
		for (int i = 0; i < N; i++) {
			if (sameRow[i] != 0) { // sameRow 만들 때 0은 카운트 하지 않는 거였음.
				int tmp = K - cnt0[i];
				if (tmp >= 0) { // 0이면 딱뎀. 그 이상이면 짝수인지 고려.
					if (tmp % 2 == 0) { // 짝수 첵.
						max = (sameRow[i] > max) ? sameRow[i] : max;
					}
				}
			}
		}
		System.out.println(max);

	}

}
  • 골드 5단계라 무서웠다. 포기할 뻔한 순간이 두 번인가 왔지만... 그래도 잘 이겨냈다.
  • 이번에도 역시나 저번과 같은 교훈을 얻었다. 그냥 코드를 짜려고 하지말고, 내가 문제를 어떻게 풀 수 있는지가 가장 중요한 것 같다. 디버깅 과정에서 메모장에 예시 입력을 가지고 출력을 만들려고 하는 과정에서, 나도 모르게 논리의 흐름이 생성됐는데, 그걸 코드에 적용하니까 그 때부터는 거의 막힘 없이 코드가 짜졌다.

'PS - BOJ' 카테고리의 다른 글

1003 - 피보나치 함수  (0) 2022.01.25
1094, 1015, 1057 - 막대기, 수열 정렬, 토너먼트  (0) 2022.01.25
1138 - 한 줄로 서기, 1032 - 명령 프롬프트  (0) 2022.01.23
1124 - 언더프라임  (0) 2022.01.23
10872 - 팩토리얼, 1065 - 한수  (0) 2022.01.22
  1. 1034
'PS - BOJ' 카테고리의 다른 글
  • 1003 - 피보나치 함수
  • 1094, 1015, 1057 - 막대기, 수열 정렬, 토너먼트
  • 1138 - 한 줄로 서기, 1032 - 명령 프롬프트
  • 1124 - 언더프라임
승농
승농
나는 실시간으로 강해지고 있는 백엔드 개발자.
승농
개발자국의 승농
승농
전체
오늘
어제
  • 분류 전체보기 (57)
    • 자유 (0)
    • 코딩 (33)
      • Java (15)
      • WEB 개발 (14)
      • Kotlin (1)
      • DB (1)
    • PS - CodeUp (9)
    • PS - BOJ (15)

블로그 메뉴

  • 블로그 소개
  • 방명록

공지사항

인기 글

관리자

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
승농
1034 - 램프
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.