코딩 테스트/백준

[Python] 백준 1244 스위치 켜고 끄기

위시리 2025. 1. 26. 22:45

 

문제 분석

  • 1부터 연속적으로 번호가 붙어있는 스위치들
  • 스위치는 켜져 있거나 꺼져있는 상태
  • 1 : 켜져 있음 / 0 : 꺼져 있음
  • 몇명의 학생에게 1 이상 스위치 개수 이하의 자연수를 하나 씩 나눠주었다.
  • 학생들은 자신의 성별과 받은 수에 따라 스위치를 조작
  • 남학생 : 받은 수의 배수인 스위치의 상태를 바꾼다.
  • 여학생 : 받은 수와 같은 번호가 붙은 스위치를 중심으로 현재 스위치의 상태가 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서 그 구간에 속한 스위치의 상태를 모두 바꾼다.

 

코드 설계

  • 카드 번호는 1부터 시작
  • 따라서 현재 번호와 리스트 안의 카드를 비교할 때, 카드번호-1 을 한 뒤 비교 해아한다.
  • 남자라면 
    • 전체 인덱스 검사 : (idx + 1) % n == 0 이라면 (배수이면) 0 <-> 1
  • 여자라면
    • 현재 점수를 기준으로 일치하는 곳까지 확인하고 해당 범위의 스위치 상태 변환

 

정답 코드

import sys
input = sys.stdin.readline

switch = int(input())
switch_state = list(map(int, input().split()))
stu_num = int(input())
students = [list(map(int, input().split())) for _ in range(stu_num)]

def change_switch(state) :
    # if state == 0 :
    #     return 1
    # return 0
    return 1-state

for g, n in students : # 받은 번호
    idx = n-1
    if g == 1 : # 남자

        # for i in range(switch) :
        #     if (i+1) % n == 0 :
        #         switch_state[i] = change_switch(switch_state[i])

        for i in range(idx, switch, n) : # 받은 번호의 배수만 처리
            switch_state[i] = change_switch(switch_state[i])

    else : # 여자
        cnt = 0
        while idx - cnt >= 0 and idx + cnt < switch:
            if switch_state[idx-cnt] == switch_state[idx+cnt] :
                cnt += 1
            else:
                break
        cnt -= 1  # 마지막 증가된 값을 조정
        for i in range(idx-cnt, idx+cnt+1) :
            switch_state[i] = change_switch(switch_state[i])

for i in range(len(switch_state)) :
    if i % 20 == 0 and i != 0 :
        print()
    print(switch_state[i], end=' ')

# 출력: 20개씩 나누어 출력
# for i in range(0, switch, 20):
#     print(' '.join(map(str, switch_state[i:i + 20])))

 

다른 사람 코드 1

def change(num):
    if switch[num] == 0:
        switch[num] = 1
    else:
        switch[num] = 0
    return


N = int(input())
switch = [-1] + list(map(int, input().split()))
students = int(input())
for _ in range(students):
    sex, num = map(int, input().split())
    # 남자
    if sex == 1:
        for i in range(num, N+1, num):
            change(i)
    # 여자
    else:
        change(num)
        for k in range(N//2):
            if num + k > N or num - k < 1 : break
            if switch[num + k] == switch[num - k]:
                change(num + k)
                change(num - k)
            else:
                break
                
for i in range(1, N+1):
    print(switch[i], end = " ")
    if i % 20 == 0 :
        print()

 

간단한건데 짜잘하게 놓친게 많아서 좀 걸렸다.. 조건과 코드에서의 조건을 맞췄는지 잘 보자

 

2차 - 25.02.05 자바

  • 스위치의 번호는 1번부터
  • 1 : 켜져 있음 / 0 : 꺼져 있음
  • 남학생 : 본인 번호의 배수인 스위치의 상태를 바꾼다.
  • 여학생 : 본인 번호 중심으로 좌우 대칭을 이루는 최대한의 범위의 스위치 상태를 바꾼다.
  • 입력 
    • 스위치 개수
    • 스위치 상태
    • 학생 수
    • 성별(남자 1, 여자 2), 받은 수
  • 1. 남여의 성별을 확인한다.
  • 2. 각 조건에 맞는 스위치를 바꾼다.

 

1차 - 런타임 에러

package a0205;

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

public class BOJ_1244 {

    static int switchNum;
    static int [] switchState;
    static int stuNum;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//        StringTokenizer st = new StringTokenizer(br.readLine()); // br으로 입력받은 값을 공백 단위로 구분
        StringTokenizer st;
//        = new StringTokenizer(br.readLine()); // br으로 입력받은 값을 공백 단위로 구분

        // 1. 입력 받기
        switchNum = Integer.parseInt(br.readLine());
        switchState = new int[switchNum];

        st = new StringTokenizer(br.readLine());
        for (int i=0 ; i<switchNum ; i++) {
            switchState[i] = Integer.parseInt(st.nextToken());
        }

        stuNum = Integer.parseInt(br.readLine());
        for (int i=0; i<stuNum; i++) {
            st = new StringTokenizer(br.readLine());
            int gender = Integer.parseInt(st.nextToken());
            int number = Integer.parseInt(st.nextToken());

            // 2. 남자라면 배수인 카드의 상태 변환
            if (gender == 1) {
                for (int j=0; j<switchNum; j++) {
                    if ((j+1) % number == 0) {
                        switchState[j] = switchState[j] == 0 ? 1 : 0;
                    }
                }
            } else {
                // 본인 숫자 변경
                switchState[number-1] = switchState[number-1] == 0 ? 1 : 0;

                // 대칭인 수 변경
                int cnt = 1;
//                while ((number-cnt) > 0 && (number+cnt) < switchState.length) {
//                    if(switchState[number-cnt] == switchState[number+cnt]) {
//                        switchState[number-cnt] = switchState[number-cnt] == 0 ? 1 : 0;
//                        switchState[number+cnt] = switchState[number+cnt] == 0 ? 1 : 0;
                while ((number - cnt - 1) >= 0 && (number + cnt - 1) < switchNum) {
                    if (switchState[number - cnt - 1] == switchState[number + cnt - 1]) {
                        switchState[number - cnt - 1] ^= 1;
                        switchState[number + cnt - 1] ^= 1;
                        cnt++;
                    } else {
                        break;
                    }
                }
            } // else
        } // for

        for (int i=0 ; i<switchNum ; i++) {
            System.out.printf("%d ", switchState[i]);
            if ((i+1) % 20 == 0) {
                System.out.println();
            }
        }
    } // main
}