백준 스위치 켜고 끄기

KIMYEONGJUN·2024년 12월 13일
1
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에는 스위치 개수가 주어진다.
스위치 개수는 100 이하인 양의 정수이다.
둘째 줄에는 각 스위치의 상태가 주어진다.
켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩 있다.
셋째 줄에는 학생수가 주어진다. 학생수는 100 이하인 양의 정수이다.
넷째 줄부터 마지막 줄까지 한 줄에 한 학생의 성별, 학생이 받은 수가 주어진다.
남학생은 1로, 여학생은 2로 표시하고, 학생이 받은 수는 스위치 개수 이하인 양의 정수이다.
학생의 성별과 받은 수 사이에 빈칸이 하나씩 있다.

스위치의 상태를 1번 스위치에서 시작하여 마지막 스위치까지 한 줄에 20개씩 출력한다.
예를 들어 21번 스위치가 있다면 이 스위치의 상태는 둘째 줄 맨 앞에 출력한다.
켜진 스위치는 1, 꺼진 스위치는 0으로 표시하고, 스위치 상태 사이에 빈칸을 하나씩 둔다.

내가 이 문제를 보고 생각해본 부분

BufferedReader를 사용하여 입력을 읽고, StringBuilder를 사용하여 출력 결과를 효율적으로 저장한다.
스위치 개수 및 초기 상태 입력:
첫 번째 줄에서 스위치의 개수를 입력받고, 두 번째 줄에서 스위치의 초기 상태를 입력받는다.
배열은 1-based 인덱스를 사용하여 스위치 번호와 쉽게 매핑되도록 설정한다.
학생 수 입력 및 상태 변경 로직:
학생 수를 입력받고, 각 학생의 성별과 받은 수를 통해 스위치 상태를 변경한다.
남학생의 경우:
남학생일 경우, 받은 수의 배수에 해당하는 스위치의 상태를 토글(켜진 상태는 꺼지고, 꺼진 상태는 켜짐)한다.
여학생의 경우:
여학생일 경우, 받은 수를 중심으로 좌우 대칭인 구간을 찾는다.
대칭이 유지되는 한 좌우로 확장하며, 해당 구간의 모든 스위치 상태를 토글한다.
최종적으로 각 스위치의 상태를 StringBuilder에 추가하고, 20개마다 줄을 바꾼다.
마지막으로 결과를 출력한다.

코드로 구현

package baekjoon.baekjoon_25;

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

// 백준 1244번 문제
public class Main866 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int switchCount = Integer.parseInt(br.readLine());
        int[] switches = new int[switchCount + 1]; // 1-based index

        // 스위치 초기 상태 입력
        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int i = 1; i <= switchCount; i++) {
            switches[i] = Integer.parseInt(st.nextToken());
        }

        int studentCount = Integer.parseInt(br.readLine());

        // 각 학생의 성별과 받은 수에 따른 스위치 상태 변경
        for(int i = 0; i < studentCount; i++) {
            st = new StringTokenizer(br.readLine());
            int gender = Integer.parseInt(st.nextToken());
            int number = Integer.parseInt(st.nextToken());

            if(gender == 1) { // 남학생
                for(int j = number; j <= switchCount; j += number) {
                    switches[j] = 1 - switches[j]; // 상태 변경
                }
            } else if(gender == 2) { // 여학생
                int left = number;
                int right = number;

                // 좌우 대칭 구간 찾기
                while(left > 1 && right < switchCount && switches[left - 1] == switches[right + 1]) {
                    left--;
                    right++;
                }

                // 구간 내 스위치 상태 변경
                for(int j = left; j <= right; j++) {
                    switches[j] = 1 - switches[j]; // 상태 변경
                }
            }
        }

        // 결과 출력
        for(int i = 1; i <= switchCount; i++) {
            sb.append(switches[i]).append(" ");
            if(i % 20 == 0) {
                sb.append("\n");
            }
        }

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

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글