minOS

[코드트리 조별과제] 흰검 칠하기 본문

Problem Solving/코드트리

[코드트리 조별과제] 흰검 칠하기

minOE 2024. 8. 9. 11:37
728x90

https://www.codetree.ai/missions/5/problems/painting-white-black

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

문제는 사이트 들어가시면 볼 수 있습니다.

이 문제는 주어진 규칙을 시뮬레이션하는 문제로, 복잡한 알고리즘보다는 문제에서 요구하는 동작을 정확하게 구현하는 것이 중요합니다.

우선 입력을 받습니다:
n = int(input())
cmd = []
for _ in range(n):
    step,direct = input().split()
    step = int(step)
    cmd.append((step,direct))​

여기서 cmd는 각 명령어를 나타내며, step은 이동할 칸의 수, direct는 이동 방향(R 또는 L)을 나타냅니다.


그 다음, 문제에서 주어진 범위를 고려하여 필요한 배열의 크기를 설정하고, 배열의 중앙을 시작점으로 지정합니다:
arr = [[2,0,0] for _ in range(200000)]
start = 100000
  • arr[i][0]은 해당 칸이 어떤 색으로 칠해졌는지를 나타냅니다.
  • arr[i][1]은 검정색으로 칠해진 횟수를, arr[i][2]은 흰색으로 칠해진 횟수를 의미합니다.

 

for step,direct in cmd :
    if direct =="R":
        for i in range(start,start+step):
            arr[i][1]+=1
            if arr[i][1]>=2 and arr[i][2]>=2:
                arr[i][0] =0 #회색
            else:
                arr[i][0] =1 #검정
        start = start+step-1
    if direct =="L":
        for i in range(start,start-step,-1):
            arr[i][2]+=1
            if arr[i][1]>=2 and arr[i][2]>=2:
                arr[i][0] =0 #회색
            else:
                arr[i][0] =-1 #흰
        start = start-step+1

명령어를 처리할 때, R과 L 방향으로 나누어 각 칸을 색칠합니다. 만약 한 칸이 검정색과 흰색으로 각각 두 번 이상 칠해지면 그 칸의 색은 회색(arr[i][0] = 0)으로 변경됩니다. 그렇지 않다면, 해당 방향의 색상으로 최신 상태를 유지합니다 (검정색은 arr[i][0] = 1, 흰색은 arr[i][0] = -1)

d = {-1: 0, 1: 0, 0: 0}
for i, _, _ in arr:
    if i in d:
        d[i] += 1

ans = d.values()
print(*ans)


해쉬맵을 정의하여 arr[i][0]의 -1,1,0 의 개수를 세고, value들을 출력 형식에 맞게 지정하여 출력하면 됩니다.

 

728x90