입력으로 받은 처음 스위치 상태에서 학생의 성별, 받은 수에 따라 스위치의 상태를 바꿨을 때 스위치의 마지막 상태를 출력
8
0 1 0 1 0 0 0 1
2
1 3
2 3
1 0 0 0 1 1 0 1
초기 스위치 상태 : 0 1 0 1 0 0 0 1
스위치의 상태를 1부터 N까지의 벡터로 생성해서 반복문으로 남학생의 번호의 배수들은 스위치를 전환
스위치의 상태가 입력된 벡터에서 입력받은 인덱스를 기준으로 앞 뒤 양쪽으로 검사
⇒ 투 포인터 (start,end로 둘 다 시작은 입력받은 인덱스로 한다.)
중요한 점:
대칭을 확인하기 전에 인덱스 위치를 바꿨기 때문에 대칭인 구간의 스위치를 전환할 때의 범위는 start는 한 인덱스 줄이기 전, end는 한 인덱스 늘어나기 전으로 설정해야한다.
#include<iostream>
using namespace std;
bool Switch[101];
int main(){
int N,M,student,num;
cin >> N;
for(int i =1; i <=N;i++){
cin >> Switch[i];
}
cin >> M;
while(M--){
cin >> student >> num;
//남학생
if(student == 1){
for(int j=num;j <= N; j += num){//입력받은 스위치 번호의 배수들
Switch[j] = !Switch[j];
}
}
//여학생
else{
int start = num;
int end = num;
while(start >= 1 && end <= N){
start--;
end++;
if(Switch[start] != Switch[end])//대칭이 아니면 반복 중단
break;
}
for(int i = start + 1; i <= end-1;i++){
Switch[i] = !Switch[i];
}
}
}
for (int i = 1; i <= N; i++)
{
cout << Switch[i] << ' ';
if (i % 20 == 0)
cout << '\n';
}
return 0;
}
🌟 초기화
int N,M,student,num;
cin >> N;//스위치 개수
for(int i =1; i <=N;i++){
cin >> Switch[i];//스위치 초기 상태 배열
}
cin >> M;//학생 수
🌟 학생이 남학생일 경우
while(M--){
cin >> student >> num;
//남학생
if(student == 1){
for(int j=num;j <= N; j += num){//입력받은 스위치 번호의 배수들
Switch[j] = !Switch[j];
}
}
학생 수만큼 반복하는 반복문 내에서 학생의 성별과 스위치 번호를 입력받는다.
학생이 1 ( 남학생)이면 반복문을 이용해 입력 받은 스위치 번호의 배수들만 boolean값을 바꿔서 스위치를 전환한다.
🌟 여학생인 경우
else{
int start = num;//포인터 초기화
int end = num;
while(start >= 1 && end <= N){
start--;
end++;
if(Switch[start] != Switch[end])//대칭이 아니면 반복 중단
break;
}
for(int i = start + 1; i <= end-1;i++){
Switch[i] = !Switch[i];
}
}
포인터 두개를 입력받은 스위치 번호로 초기화하고 범위 내에서 start는 앞으로 end는 뒤로 이동시키면서 대칭인지 검사한다. 두 포인터가 같은 인덱스로 초기화되었기 때문에 인덱스 부터 움직이고 검사, 대칭이 아니면 바로 반복문 중단
대칭을 확인하는 반복문에서 포인터의 위치를 먼저 이동시키고 확인했기 때문에 마지막 실행에서는 포인터들이 대칭이 아닌 인덱스를 가리킨다. → 인덱스를 이동시킨 범위에 대해서 스위치를 전환해줘야한다.
🌟 출력
for (int i = 1; i <= N; i++)
{
cout << Switch[i] << ' ';
if (i % 20 == 0)
cout << '\n';
}
스위치는 20개씩 출력하고 그 이상은 다음 줄에 출력해야한다.
→ 조건문으로 인덱스가 20을 넘으면 개행문자(엔터) 출력