여니의 취준 준비/코딩테스트 (Python)

[n1244] 스위치 켜고 끄기

여니's 2021. 5. 21. 15:46

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

 

1244번: 스위치 켜고 끄기

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

www.acmicpc.net

(문제)

스위치들의 마지막 상태를 출력하는 문제.

학생들은 자신의 성별과 받은 수에 따라 스위치를 조작한다.

 

남학생

스위치 번호가 자기가 받은 수의 배수이면, 그 스위치의 상태를 바꾼다

 스위치가 켜져 있으면 끄고, 꺼져 있으면 켠다

 

여학생

 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서

가장 많은 스위치를 포함하는 구간을 찾아서, 

그 구간에 속한 스위치의 상태를 모두 바꾼다. 

이때 구간에 속한 스위치 개수는 항상 홀수가 된다.

 


(처음 든 생각)

구현인 것 같다..?

알고리즘이 생각나지 않았고,

연산해야하는 수의 크기도 크지 않았다


(풀이)

man과 woman을 함수로 구현해주었다.

 

스위치 상태 바꾸는 부분에서는 if else문을 쓰지 않고

int(not array[i]) 이런식으로

not문을 활용해서 값을 반대로 바꿔주었다. ** 

 

 

 

switch_num = int(input()) # 스위치 개수
array = list(map(int, input().split()))  # turn on 1 , turn off 0
student = int(input()) # 학생 수


def man(array, num):
    # 바꿔야하는 스위치 개수, 
    # num이 3이고, switch_num이 8이라면, 3, 6 총 2개의 스위치 상태를 바꿔줘야 한다.
    # 8//3 = 2
    for i in range(1, switch_num // num + 1):  
       idx = num * i - 1 # 바꿔야하는 스위치 인덱스
       array[idx] = int(not array[idx])
    return array


def woman(array, num):
    mid = num - 1
    left = mid - 1
    right = mid + 1
    array[mid] = int(not array[mid])  # 현재 스위치 상태 바꾸기
    while True: # 좌우가 대칭인 구간을 파악하는 단계
        if left >= 0 and right < len(array):  # left, right가 구간내에 있다면
            if array[left] == array[right]:  # 대칭이면
                array[left] = int(not array[left]) # 스위치 상태 바꾸기 - left
                array[right] = int(not array[right]) # 스위치 상태 바꾸기 - right
                # left, right 1칸씩 이동
                left-=1
                right+=1
                continue
                
            # 대칭아니면?
            return array
        else:
            return array


for i in range(student):
    gender, num = map(int, input().split())
    if gender == 1:  # 남
        man(array, num)
        continue
    # 여
    woman(array, num)

for i in range(1,switch_num+1):
    if i%20==0: #줄바꿈
        print(array[i-1])
    else:
        print(array[i-1],end=' ')

 

man : 1

인덱스 때문에 살짝 헷갈렸던 부분

받아오는 건 3인데, 실제 인덱스 값은 2이기 때문에..

이 부분을 처리해주려면

num * i -1

받아온 num에 i를 곱하고 거기에 -1를 해주면 된다.

1씩 밀려있는 상태니까

 

 

 

woman : 2

현재 스위치 상태는 1번만 바꾸면 되기때문에 

반복문 시작하기 전에 미리 바꿔둔다.

그리고 좌우가 대칭이면 각각 값을 반대로 뒤집어준다.

(스위치가 켜져있으면 끄고, 꺼져있으면 켠다)

 

좌우가 대칭이 아닐 경우에는 아무런 작업을 하지 않고 함수를 종료!

 


(예전에 풀어놨던 풀이)

# 1244번. 스위치 켜고 끄기
switch_num = int(input())
state = list(map(int, input().split()))
student_num = int(input())

def man(array, num):
    for i in range(switch_num // num):
        idx = ((i + 1) * num) - 1
        array[idx] = int(not array[idx])
    return array

def woman(array, num):
    center = num - 1
    idx = 1
    array[center] = int(not array[center])

    while True:
        if center - idx > -1 and center + idx < switch_num:
            if array[center - idx] == array[center + idx]:
                array[center - idx] = int(not array[center - idx])
                array[center + idx] = int(not array[center + idx])
                idx += 1
                continue
            else:
                return array
        else:
            return array

for i in range(student_num):
    array = list(map(int, input().split()))
    if array[0] == 1:
        man(state, array[1])
        continue
    else:
        woman(state, array[1])

for i in range(1, switch_num + 1):
    if i % 20 == 0:
        print(state[i - 1])
    else:
        print(state[i - 1], end=' ')

** 해당하는 num의 배수를 찾을 때, for문으로 다 돌리지 않았음 (시간 절약을 위해) **

** 출력 조건 제대로 확인하기 ** 


 

'여니의 취준 준비 > 코딩테스트 (Python)' 카테고리의 다른 글

[n20291] 파일 정리  (0) 2021.05.21
[n10994] 별 찍기 - 19  (0) 2021.05.21
[Python] n4396 | 지뢰찾기  (0) 2021.05.05
[Python] n2578번 | 빙고  (0) 2021.05.03
[Python] n12933번 | 오리  (0) 2021.05.03