본문 바로가기
Algorithm(CodeTree, Python)/완전탐색1

[코드트리 구간 단위로 완전탐색] G or H 2 python

by kurooru 2022. 12. 9.
# n 입력
n = int(input())
# linear
linear = [0] * 101
# pos, alpha 입력
for _ in range(n):
    pos, alpha = input().split()
    # linear에 입력
    linear[int(pos)] = alpha

# 함수들
# exists(s, e)
def exists(s, e):
    
    # 양 끝에 사람이 있는지 반환
    return linear[s] and linear[e-1]

# only_g(s, e)
def only_g(s, e):
    
    # g_cnt
    g_cnt = 0

    # 현 범위 중
    for i in range(s, e):
        # 한 번이라도 'H'가 나오면
        if linear[i] == 'H':
            # 실패
            return False
    
    # 다 돌고나서
    # g_cnt 가 1 이상이면
    if g_cnt >= 1:
        # 성공
        return True
    
    # 이외에는 실패
    return False

# only_h(s, e):
def only_h(s, e):
    
    # h_cnt
    h_cnt = 0

    # 현 범위 중
    for i in range(s, e):
        # 한 번이라도 'G'가 나오면
        if linear[i] == 'G':
            # 실패
            return False
    
    # 다 돌고나서
    # h_cnt 가 1 이상이면
    if h_cnt >= 1:
        # 성공
        return True
    
    # 이외에는 실패
    return False

# same_g_h(s, e)
def same_g_h(s, e):
    
    # g_cnt, h_cnt
    g_cnt, h_cnt = 0, 0

    # 현 범위중
    for i in range(s, e):
        # 'G'가 나오면
        if linear[i] == 'G':
            # g_cnt 올려주기
            g_cnt += 1
        # 'H'가 나오면
        elif linear[i] == 'H':
            # h_cnt 올려죽
            h_cnt += 1
    
    # 갯수가 같은지 반환
    return g_cnt == h_cnt

# 설계
# max_len
max_len = 0

# 양 끝점 잡기
for i in range(1, 101):
    for j in range(i+1, 102):
        # 양 끝점에 사람이 있고, 오로지 G로 이루어져 있으면,
        if exists(i, j) and only_g(i, j):
            # max_len 업데이트
            max_len = max(max_len, j-i-1)
        # 양 끝점에 사람이 있고, 오로지 H로 이루어져 있으면,
        elif exists(i, j) and only_h(i, j):
            # max_len 업데이트
            max_len = max(max_len, j-i-1)
        # 양 끝점에 사람이 있고, G와 H가 정확히 같은 갯수만큼 있다면,
        elif exists(i, j) and same_g_h(i, j):
            # max_len 업데이트
            max_len = max(max_len, j-i-1)

# 출력
print(max_len)