백준 스위치 켜고 끄기

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개의 댓글

관련 채용 정보