[백준/Java] 1244 - 스위치 켜고 끄기

2025. 9. 3. 17:18·코딩테스트/백준

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

문제


풀이

나만 그런지 몰라도 글이 매우 어렵게 느껴졌다

정리해보면 주어진 스위치가 있는데

남학생 -> 스위치 번호가 받은 수의 배수인 것만 상태 바꿈 

여학생 -> 받은 수를 중심으로 대칭 탐색 -> 대칭인 스위치 상태가 같아야 함

코드를 보면 이해가 갈 것이다

 

배열 인덱스가 1부터 시작해서 처음엔 배열 범위 밖으로 나가서 런타임 에러가 났었다

코드

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

public class Main {

    static int N;
    static int[] sch;
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        // 스위치 개수 입력
        N = Integer.parseInt(br.readLine());
        sch = new int[N + 1];

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

        // 사람 수 입력
        int M = Integer.parseInt(br.readLine());
        for (int i = 0; i < M; i++) {
            // 성별, 스위치 번호 입력
            st = new StringTokenizer(br.readLine());
            int s = Integer.parseInt(st.nextToken());
            int num = Integer.parseInt(st.nextToken());

            // 조건에 맞는 스위치 상태 바꾸는 메서드
            task(s, num);
        }

        for (int i = 1; i <= N; i++) {
            sb.append(sch[i] + " ");
            if (i % 20 == 0) {
                sb.append("\n");
            }
        }

        System.out.println(sb);
    }

    static void task(int s, int num) {
        // 남학생이라면
        if (s == 1) {
            // num의 배수만 스위치 상태를 바꿔줌
            for (int i = num; i <= N; i++) {
                if (i % num == 0) {
                    change(i);
                }
            }
        } else {
            // num의 전과 후를 설정
            int i = num - 1;
            int j = num + 1;
            // 고른 번호의 스위치는 무조건 바뀌어야 함
            change(num);
            while (true) {
                // i, j가 배열 범위를 넘어가면 break
                if (i <= 0 || j > N + 1) {
                    break;
                }
                // 대칭으로 상태가 같다면 상태를 바꿔줌
                if (sch[i] == sch[j]) {
                    change(i);
                    change(j);
                } else {
                    // 대칭 스위치 상태가 다르면 break
                    break;
                }

                // i, j 갱신
                i--;
                j++;
            }
        }
    }

    // 스위치 상태 바꾸는 메서드
    // 1 -> 0 / 0 -> 1
    private static void change(int num) {
        if (sch[num] == 1) {
            sch[num] = 0;
        } else {
            sch[num] = 1;
        }
    }
}

결과

'코딩테스트/백준' 카테고리의 다른 글
  • [백준/Java] 16935 - 배열 돌리기 3
  • [백준/Java] 1012 - 유기농 배추
  • [백준/Java] 17626 - Four Squares
  • [백준/Java] 11659 - 구간 합 구하기 4
KDH.dev
KDH.dev
  • KDH.dev
    CodingHard
    KDH.dev
  • 전체
    오늘
    어제
    • 전체글 (82)
      • 코딩테스트 (74)
        • 프로그래머스 (13)
        • 백준 (61)
      • CS (4)
        • 네트워크 (4)
      • Spring (1)
      • Java (3)
        • 자료구조 (3)
        • 알고리즘 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    17626
    21736
    코딩테스트
    CS
    5525
    [LG유플러스] 유레카 백엔드 개발자
    부트캠프후기
    13913
    16935
    프로그래머스
    18111
    네트워크
    자바
    백준
    11660
    14940
    멀티캠퍼스it부트캠프
    프로그래머스 Lv.0
    자료구조
    30804
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
KDH.dev
[백준/Java] 1244 - 스위치 켜고 끄기
상단으로

티스토리툴바