PS/BaekJoon

1244 Python μŠ€μœ„μΉ˜ 켜고 끄기

chaerlo127 2023. 2. 20. 17:26
728x90
 

1244번: μŠ€μœ„μΉ˜ 켜고 끄기

첫째 μ€„μ—λŠ” μŠ€μœ„μΉ˜ κ°œμˆ˜κ°€ 주어진닀. μŠ€μœ„μΉ˜ κ°œμˆ˜λŠ” 100 μ΄ν•˜μΈ μ–‘μ˜ μ •μˆ˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” 각 μŠ€μœ„μΉ˜μ˜ μƒνƒœκ°€ 주어진닀. 켜져 있으면 1, 꺼져있으면 0이라고 ν‘œμ‹œν•˜κ³  사이에 빈칸이 ν•˜λ‚˜μ”©

www.acmicpc.net

문제

1λΆ€ν„° μ—°μ†μ μœΌλ‘œ λ²ˆν˜Έκ°€ λΆ™μ–΄μžˆλŠ” μŠ€μœ„μΉ˜λ“€μ΄ μžˆλ‹€. μŠ€μœ„μΉ˜λŠ” 켜져 μžˆκ±°λ‚˜ κΊΌμ ΈμžˆλŠ” μƒνƒœμ΄λ‹€. <κ·Έλ¦Ό 1>에 μŠ€μœ„μΉ˜ 8개의 μƒνƒœκ°€ ν‘œμ‹œλ˜μ–΄ μžˆλ‹€. ‘1’은 μŠ€μœ„μΉ˜κ°€ 켜져 μžˆμŒμ„, ‘0’은 κΊΌμ Έ μžˆμŒμ„ λ‚˜νƒ€λ‚Έλ‹€. 그리고 학생 λͺ‡ λͺ…을 λ½‘μ•„μ„œ, ν•™μƒλ“€μ—κ²Œ 1 이상이고 μŠ€μœ„μΉ˜ 개수 μ΄ν•˜μΈ μžμ—°μˆ˜λ₯Ό ν•˜λ‚˜μ”© λ‚˜λˆ„μ–΄μ£Όμ—ˆλ‹€. 학생듀은 μžμ‹ μ˜ 성별과 받은 μˆ˜μ— 따라 μ•„λž˜μ™€ 같은 λ°©μ‹μœΌλ‘œ μŠ€μœ„μΉ˜λ₯Ό μ‘°μž‘ν•˜κ²Œ λœλ‹€.

남학생은 μŠ€μœ„μΉ˜ λ²ˆν˜Έκ°€ μžκΈ°κ°€ 받은 수의 배수이면, κ·Έ μŠ€μœ„μΉ˜μ˜ μƒνƒœλ₯Ό λ°”κΎΌλ‹€. 즉, μŠ€μœ„μΉ˜κ°€ 켜져 있으면 끄고, κΊΌμ Έ 있으면 μΌ λ‹€. <κ·Έλ¦Ό 1>κ³Ό 같은 μƒνƒœμ—μ„œ 남학생이 3을 λ°›μ•˜λ‹€λ©΄, 이 학생은 <κ·Έλ¦Ό 2>와 같이 3번, 6번 μŠ€μœ„μΉ˜μ˜ μƒνƒœλ₯Ό λ°”κΎΌλ‹€.

여학생은 μžκΈ°κ°€ 받은 μˆ˜μ™€ 같은 λ²ˆν˜Έκ°€ 뢙은 μŠ€μœ„μΉ˜λ₯Ό μ€‘μ‹¬μœΌλ‘œ μ’Œμš°κ°€ λŒ€μΉ­μ΄λ©΄μ„œ κ°€μž₯ λ§Žμ€ μŠ€μœ„μΉ˜λ₯Ό ν¬ν•¨ν•˜λŠ” ꡬ간을 μ°Ύμ•„μ„œ, κ·Έ ꡬ간에 μ†ν•œ μŠ€μœ„μΉ˜μ˜ μƒνƒœλ₯Ό λͺ¨λ‘ λ°”κΎΌλ‹€. μ΄λ•Œ ꡬ간에 μ†ν•œ μŠ€μœ„μΉ˜ κ°œμˆ˜λŠ” 항상 ν™€μˆ˜κ°€ λœλ‹€.

μŠ€μœ„μΉ˜ λ²ˆν˜ΈμŠ€μœ„μΉ˜ μƒνƒœ

β‘  β‘‘ β‘’ β‘£ β‘€ β‘₯ ⑦ ⑧
0 1 0 1 0 0 0 1

<κ·Έλ¦Ό 1>

예λ₯Ό λ“€μ–΄ <κ·Έλ¦Ό 2>μ—μ„œ 여학생이 3을 λ°›μ•˜λ‹€λ©΄, 3번 μŠ€μœ„μΉ˜λ₯Ό μ€‘μ‹¬μœΌλ‘œ 2번, 4번 μŠ€μœ„μΉ˜μ˜ μƒνƒœκ°€ κ°™κ³  1번, 5번 μŠ€μœ„μΉ˜μ˜ μƒνƒœκ°€ κ°™μœΌλ―€λ‘œ, <κ·Έλ¦Ό 3>κ³Ό 같이 1λ²ˆλΆ€ν„° 5λ²ˆκΉŒμ§€ μŠ€μœ„μΉ˜μ˜ μƒνƒœλ₯Ό λͺ¨λ‘ λ°”κΎΌλ‹€. λ§Œμ•½ <κ·Έλ¦Ό 2>μ—μ„œ 여학생이 4λ₯Ό λ°›μ•˜λ‹€λ©΄, 3번, 5번 μŠ€μœ„μΉ˜μ˜ μƒνƒœκ°€ μ„œλ‘œ λ‹€λ₯΄λ―€λ‘œ 4번 μŠ€μœ„μΉ˜μ˜ μƒνƒœλ§Œ λ°”κΎΌλ‹€.

μŠ€μœ„μΉ˜ λ²ˆν˜ΈμŠ€μœ„μΉ˜ μƒνƒœ

β‘  β‘‘ β‘’ β‘£ β‘€ β‘₯ ⑦ ⑧
0 1 1 1 0 1 0 1

<κ·Έλ¦Ό 2>

μŠ€μœ„μΉ˜ λ²ˆν˜ΈμŠ€μœ„μΉ˜ μƒνƒœ

β‘  β‘‘ β‘’ β‘£ β‘€ β‘₯ ⑦ ⑧
1 0 0 0 1 1 0 1

<κ·Έλ¦Ό 3>

μž…λ ₯으둜 μŠ€μœ„μΉ˜λ“€μ˜ 처음 μƒνƒœκ°€ 주어지고, 각 ν•™μƒμ˜ 성별과 받은 μˆ˜κ°€ 주어진닀. 학생듀은 μž…λ ₯λ˜λŠ” μˆœμ„œλŒ€λ‘œ 자기의 성별과 받은 μˆ˜μ— 따라 μŠ€μœ„μΉ˜μ˜ μƒνƒœλ₯Ό λ°”κΎΈμ—ˆμ„ λ•Œ, μŠ€μœ„μΉ˜λ“€μ˜ λ§ˆμ§€λ§‰ μƒνƒœλ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 μ€„μ—λŠ” μŠ€μœ„μΉ˜ κ°œμˆ˜κ°€ 주어진닀. μŠ€μœ„μΉ˜ κ°œμˆ˜λŠ” 100 μ΄ν•˜μΈ μ–‘μ˜ μ •μˆ˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” 각 μŠ€μœ„μΉ˜μ˜ μƒνƒœκ°€ 주어진닀. 켜져 있으면 1, 꺼져있으면 0이라고 ν‘œμ‹œν•˜κ³  사이에 빈칸이 ν•˜λ‚˜μ”© μžˆλ‹€. μ…‹μ§Έ μ€„μ—λŠ” ν•™μƒμˆ˜κ°€ 주어진닀. ν•™μƒμˆ˜λŠ” 100 μ΄ν•˜μΈ μ–‘μ˜ μ •μˆ˜μ΄λ‹€. λ„·μ§Έ 쀄뢀터 λ§ˆμ§€λ§‰ μ€„κΉŒμ§€ ν•œ 쀄에 ν•œ ν•™μƒμ˜ 성별, 학생이 받은 μˆ˜κ°€ 주어진닀. 남학생은 1둜, 여학생은 2둜 ν‘œμ‹œν•˜κ³ , 학생이 받은 μˆ˜λŠ” μŠ€μœ„μΉ˜ 개수 μ΄ν•˜μΈ μ–‘μ˜ μ •μˆ˜μ΄λ‹€. ν•™μƒμ˜ 성별과 받은 수 사이에 빈칸이 ν•˜λ‚˜μ”© μžˆλ‹€.

 

좜λ ₯

μŠ€μœ„μΉ˜μ˜ μƒνƒœλ₯Ό 1번 μŠ€μœ„μΉ˜μ—μ„œ μ‹œμž‘ν•˜μ—¬ λ§ˆμ§€λ§‰ μŠ€μœ„μΉ˜κΉŒμ§€ ν•œ 쀄에 20κ°œμ”© 좜λ ₯ν•œλ‹€. 예λ₯Ό λ“€μ–΄ 21번 μŠ€μœ„μΉ˜κ°€ μžˆλ‹€λ©΄ 이 μŠ€μœ„μΉ˜μ˜ μƒνƒœλŠ” λ‘˜μ§Έ 쀄 맨 μ•žμ— 좜λ ₯ν•œλ‹€. μΌœμ§„ μŠ€μœ„μΉ˜λŠ” 1, 꺼진 μŠ€μœ„μΉ˜λŠ” 0으둜 ν‘œμ‹œν•˜κ³ , μŠ€μœ„μΉ˜ μƒνƒœ 사이에 λΉˆμΉΈμ„ ν•˜λ‚˜μ”© λ‘”λ‹€.

 

μ½”λ“œ

import sys

n = int(sys.stdin.readline())

array = [0] + list(map(int, sys.stdin.readline().split()))
student_num = int(sys.stdin.readline())


def change_switch(personNum):
    if array[personNum] == 0:
        array[personNum] = 1
    elif array[personNum] == 1:
        array[personNum] = 0


for _ in range(student_num):
    person, person_num = map(int, sys.stdin.readline().split())  # 성별, μŠ€μœ„μΉ˜ 받은 수

    if person == 1:  # λ‚¨μžμΈ 경우
        for i in range(1, n + 1):
            if i * person_num > n:
                break
            else:
                change_switch(person_num * i)

    elif person == 2:  # μ—¬μžμΈ 경우
        change_switch(person_num)  # 일단 자기 μžμ‹ μ„ λ°”κΎΈκ³ 
        for i in range(int(n / 2)):
            if person_num + i > n or person_num - i < 1:  # index μ˜μ—­ λ°–μ—μ„œ λ²—μ–΄λ‚˜λ©΄ λ©ˆμΆ”κ³ 
                break
            if array[person_num - i] == array[person_num + i]:  # μ–‘ μ˜†μ˜ 값이 κ°™μœΌλ©΄ μŠ€μœ„μΉ˜λ₯Ό λ³€κ²½ν•΄μ£Όκ³ 
                change_switch(person_num - i)
                change_switch(person_num + i)
            else:  # 값이 λ‹€λ₯΄λ©΄ λ°”λ‘œ 멈좀
                break

for j in range(1, n + 1):
    print(array[j], end=" ")
    if j % 20 == 0:  # μ˜ˆμ™Έ 처리 쑰심! 문제 μžμ„Ένžˆ 읽어 보기
        print()
728x90