풀이 개념

주어진 조건에 따라 구현하면 된다.
우선 남학생과 여학생의 스위치 조작을 따로 함수로 선언한다.

  • 남학생은 while문을 통해 스위치를 차례대로 조작한다.

    숫자가 3 일때, switches[2] 조작, switches[5] 조작, switches[8] 조작 ...

  • 여학생도 while문을 통해 스위치를 차례대로 조작하는데, 오프셋 개념을 이용한다.

    해당 숫자의 오프셋만큼 +- 하여 체크 후 조작한다.

    offset 0 : switches[2] 조작
    offset 1 : switches[2 - 1], switches[2 + 1] 조작
    offset 2 : switches[2 - 2], switches[2 + 2] 조작

    ...

추가적으로, 스위치 조작은 1을 0으로, 0을 1로 바꾸는 토글 동작으로 이루어진다.
이 역시 함수로 만들어서 이용한다.

풀이

  1. 입력값들을 알맞게 저장한다.
  2. 학생 수 만큼 for문을 돌려 각 학생별로 입력을 받고, 성별에 따라 함수를 동작한다.
  3. 함수는 위의 풀이 개념대로 구현한다.

코드

def switchToggle(switch):
    return (0 if switch else 1)

def switchBoy(switches, switch):
    idx = switch - 1
    while True:
        if idx >= len(switches):
            break
        switches[idx] = switchToggle(switches[idx])
        idx += switch

    return

def switchGirl(switches, switch):
    idx = switch - 1
    switches[idx] = switchToggle(switches[idx])
    offset = 1

    while True:
        if idx - offset < 0 or idx + offset >= len(switches):
            break
        if switches[idx - offset] != switches[idx + offset]:
            break
        switches[idx - offset] = switchToggle(switches[idx - offset])
        switches[idx + offset] = switchToggle(switches[idx + offset])
        offset += 1

    return

switch_len = int(input())
switches = list(map(int, input().split()))
student_len = int(input())
for i in range(student_len):
    sex, switch = map(int, input().split())
    if sex == 1:
        switchBoy(switches, switch)
    else:
        switchGirl(switches, switch)

for i in range(0, switch_len, 20):
    print(*switches[i : i+20])

참고자료

  1. 코딩도장 리스트 언패킹

풀이 개념

직사각형의 면적을 구한다 = 직사각형이 차지하는 1x1 크기의 칸들을 하나 하나 색칠한다는 생각으로 접근한다. xy 좌표 평면을 2차원 리스트로 선언한 후, 직사각형이 접근하는 좌표들을 True로 바꿔주며 색칠한다.

예시) 1x1 크기의 직사각형이 색칠되어있다.

아래와 같이 (1, 2) 부터 (2, 3)까지 1x1 크기의 정사각형이 색칠되어 있다는 것은, (1, 2)의 값이 True 라는 것을 뜻한다.

이러한 방법으로, (x1, y1) 부터 (x2, y2)까지 있는 직사각형을 색칠한다고 하면 2차원 리스트는 아래와 같다.

풀이

  1. 입력 조건에 있는 1 ≤ x, y ≤ 100 를 참고하여, xy 좌표평면을 구현할 2차원 리스트를 선언한다.(False로 초기화)
  2. 색칠하는 면적을 카운트할 변수 area = 0 선언
  3. 입력 값을 받고 색칠 시작!
  4. x1 ~ x2 for문, y1 ~ y2 for문을 통해 1x1 사각형을 일일이 색칠한다.(False를 True로 바꾸기)
  5. 이 때, 색칠되는 면적(True로 바꾸는 갯수)만큼 area를 증가시킨다.
  6. 만약 이미 색칠되어 있다면(이미 True라면) 건너뛴다.
  7. 마지막으로 색칠된 면적(area)을 return한다.

코드

xy_map = [[False for x in range(101)] for y in range(101)]

area = 0
for cnt in range(4):
    x1, y1, x2, y2 = map(int, input().split())
    for i in range(x1, x2):
        for j in range(y1, y2):
            if xy_map[i][j]: continue

            area += 1
            xy_map[i][j] = True

print(area)

참고자료

  1. 리스트 for문으로 초기화하기(파이썬 공식 문서)
  2. 5. Data Structures - Python 3.9.6 documentation
  3. map 함수로 입력 받기(코딩 도장)
  4. 파이썬 코딩 도장

풀이 개념

두 번째 수를 선정할 때, 첫 번째 수보다 큰 값이 들어간다면 길이가 2보다 커질 수 없다.

list[0] = n
list[1] = n + α
# list[2] = -α

len(list) = 2

그러나, 두 번째 수가 첫 번째 수와 같다면 리스트 길이는 4이 된다.

list[0] = n
list[1] = n
list[2] = 0
list[3] = n
# list[4] = -n

len(list) = 4

따라서 최대 개수의 수들을 구할 때, 두 번째 수는 첫 번째 수보다 작거나 같은 수들만 체크하면 된다.

가능한 모든 두 번째 수를 for문을 통해 순회하며 체크한다.(브루트 포스)

풀이

  1. 첫 번째 수를 n 변수에 입력받는다.
  2. 최대 길이를 가진 수들을 저장할 my_list를 선언한다.
  3. for문을 통해 두 번째 수를 모두 검사한다.(두 번째 수 = i)
  4. 첫 번째, 두 번째 수가 정해졌을 때 조건을 만족하는 수들을 저장할 my_list를 선언한다.
  5. while문을 통해 세 번째 수부터 my_list에 저장한다.(종료조건 : 다음 수가 음수일 때)
  6. my_list를 다 만들면 max_list의 길이와 비교하고, 더 길면 max_list로 저장한다.
  7. 출력

코드

n = int(input())

max_list = []
for i in range(1, n + 1):
    my_list = [n]
    my_list.append(i)

    idx = 1
    while True:
        next_num = my_list[idx - 1] - my_list[idx]
        if next_num < 0:
            break
        my_list.append(next_num)
        idx += 1

    if len(max_list) < len(my_list):
        max_list = my_list

print(len(max_list))
for i in max_list:
    print(i, end=' ')

참고자료

없음

+ Recent posts