반응형
Recent Posts
Recent Comments
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Today
Total
관리 메뉴

꿈꾸는 개발자의 devLog

[BaekJoon] "구현" - 백준 1244번 문제 : 스위치 켜고 끄기 본문

Algorithm/BaekJoon

[BaekJoon] "구현" - 백준 1244번 문제 : 스위치 켜고 끄기

덩화 2024. 1. 18. 10:43
반응형

[문제 설명]

https://www.acmicpc.net/problem/1244

 

1244번: 스위치 켜고 끄기

첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩

www.acmicpc.net

 

1부터 연속적으로 번호가 붙어있는 스위치들이 있음. 스위치는 켜져 있거나 꺼져 있는 상태

1 : 스위치 켜져 있음, 0 : 스위치 꺼져 있음

남학생은 스위치 번호가 자기가 받은 수의 배수이면, 그 스위치의 상태를 바꿈

켜져있으면 끄고, 꺼져 있으면 킴

여학생은 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서, 그 구간에 속한 스위치의 상태를 모두 바꿈 ( 이때, 구간에 속한 스위치 개수는 항상 홀수가 됨)

 

[해결 로직]

- 일단, 남학생인 경우에는 자신이 선택한 수의 배수에 위치한 스위치들의 상태를 바꿔줌

- 여기서 비트연산으로 ^1 해주면 0에서 1로, 1에서 0으로 바뀜

- 그럼 여학생일 때는 자기가 선택한 스위치 먼저 상태 바꿔줌

- 그러고 나서 일단 처음 부터 끝까지 양 옆으로 탐색을 진행하는데

- 스위치 범위 내에 서로 값이 같다면 상태 바꿔줌. 그렇지 않으면 탐색 탈출

- 여기서 탈출 (else문을 설정하지 않으면)하지 않으면, 연속된 구간을 벗어나서 다시 또 값이 같은 범위를 찾기 때문에 무 조건 탈출문을 선언해줘야 함

- 이 부분 때문에 오류 발생하였음

 

[Solution 코드]

n = int(input())
ary = list(map(int, input().split()))
k = int(input())
stu_lst = []
for i in range(k):
  in1, in2 = map(int, input().split())
  stu_lst.append((in1, in2))

for i in range(k):
  gen, swc = stu_lst[i][0], stu_lst[i][1]

  if gen == 1:  ## 남자일때
    for x in range(n):
        if (x + 1) % swc == 0:  ## 배수인것만 바꿈
            ary[x] = ary[x] ^ 1
  else:  ## 여자일때
    ## 일단 처음과 끝이랑 비교해서 가장 가까운 수 구해서
    ## 비교 횟수 구하기
    
    strt = swc - 1
    ends = n - swc
    difs = 0

    difs = strt if strt <= ends else ends
    #print(difs)
    ary[strt] = ary[strt] ^ 1
    
    for i in range(difs):
        befx = (swc - 1) - (i + 1)
        aftx = (swc - 1) + (i + 1)
        #print(befx, aftx)
        if (befx >= 0 and aftx < n): ## 스위치 범위 내
            if ary[befx] == ary[aftx]: # 서로 값이 같다면
                ary[befx] = ary[befx] ^ 1
                ary[aftx] = ary[aftx] ^ 1
            else:
               break
        else:
            break

for idx, value in enumerate(ary):
    print(value, end = " ")
    
    if (idx + 1) % 20 == 0:
        print()
반응형
Comments