내가 생각했을때 문제에서 원하는부분
첫째 줄에는 스위치 개수가 주어진다.
스위치 개수는 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();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.