문제번호: 1244
문제명: 스위치 켜고 끄기
문제링크: https://www.acmicpc.net/problem/1244
문제내용과 예제 입/출력은 위 문제 링크에서 확인해 주시기 바랍니다
오늘은 구현문제를 풀었습니다. 남학생의 경우 스위치 상태를 바꾸는 조건은 스위치를 순회하며 스위치 순서 번호가 입력숫자로 나누어떨어진다면 상태를 바꾸도록 하였습니다.
여자의 경우가 남자의 경우보단 더 까다로웠습니다. 두 포인터를 사용하여 while문으로 순회하며 포인터를 양쪽으로 이동시키고 last포인터 변수를 이용하여 포인터위치를 저장시켰습니다. 그렇게 순회가 끝나고 마지막으로 선택된 범위들의 상태를 바꿔주었습니다.
이번 문제를 풀면서 XOR연산을 처음 써보았습니다(^). 스위치의 상태를 바꿀 때 switches[j] ^= 1; 와 같이 토글기능을 구현할 수 있었습니다.
다음은 정답코드입니다.
public static void Main()
{
using StreamReader sr = new StreamReader(Console.OpenStandardInput());
using StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
int N = int.Parse(sr.ReadLine());
int[] switches = Array.ConvertAll(sr.ReadLine().Split(), int.Parse);
int studentCount = int.Parse(sr.ReadLine());
for (int i = 0; i < studentCount; i++)
{
int[] input = Array.ConvertAll(sr.ReadLine().Split(), int.Parse);
int gender = input[0];
int number = input[1];
if (gender == 1) // 남자
{
for (int j = 0; j < switches.Length; j++)
{
if ((j + 1) % number == 0)
{
switches[j] ^= 1;
}
}
}
else if (gender == 2) // 여자
{
int center = number - 1;
int left = center - 1;
int right = center + 1;
int left_lp = center;
int right_lp = center;
while (left >= 0 && right < switches.Length && switches[left] == switches[right])
{
left_lp = left;
right_lp = right;
left--;
right++;
}
for (int j = left_lp; j <= right_lp; j++)
{
switches[j] ^= 1;
}
}
}
int writeCount = 0;
foreach(int n in switches)
{
if (writeCount == 20)
{
writeCount = 0;
sw.WriteLine();
}
sw.Write(n + " ");
writeCount++;
}
}
'알고리즘 풀이' 카테고리의 다른 글
| [C#] 백준 30088번 문제풀이 (1) | 2026.03.09 |
|---|---|
| [C#] 백준 11660번 문제풀이 (0) | 2026.03.07 |
| [C#] 백준 1916번 문제풀이 (0) | 2026.03.05 |
| [C#] 백준 18185번 문제풀이 (2) | 2026.03.04 |
| [C#] 백준 11004번 문제풀이 (0) | 2026.03.03 |