코딩 테스트/백준
[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
}