티스토리 뷰

반응형

엘리베이터 조명천장 홀계산하는 로직 개발

#031 홀간격계산
def calculate_hole_positions_separated_lc031(LCD):    
    center = LCD // 2  # 중심 지점
    central_start = center - 185  # 중심 구간 시작
    central_end = center + 185  # 중심 구간 끝

    left_positions = []
    right_positions = []

    # 중심으로부터 왼쪽 계산
    left_current = central_start
    while left_current > 0:
        left_positions.insert(0, left_current)
        left_current -= 220

    # 중심으로부터 오른쪽 계산
    right_current = central_end
    while right_current < LCD:
        right_positions.append(right_current)
        right_current += 220

    # 결과 리스트 합치기
    positions = left_positions + right_positions

    return positions


위의 함수를 이용해서 
#035 홀간격계산
def calculate_hole_positions_separated_lc035(LCD):    

함수를 제작할 것이다.



규칙은 center 기준 -15, +15 이렇게 시작해서 양쪽으로 홀이 형성되는 것이다.

첫번째 홀이 x1이라고 하면,
x1은 54부터 시작이다. 

예를 들면, LCD값이 1450이라면
center= 1450/2 값이고, 
x1은 54, x의 마지막홀은 LCD-54에 해당된다.

그러면, 4개의 홀은 이미 확보된 것이다. 54, center-15, center+15, LCD-54

이제 나머지 홀의 위치는 나머지 영역, 즉 center기준 좌측에 해당되는 영역은
1450/2의 값인 725-54-15 = 656의 숫자를 200에서 250의 간격으로 그 영역을 분할하는데, 보통 3분할 또는 4분할이 나올 것이다.
그러면 예시를 들은 것은 1450 LCD는
54, 218, 220, 218, 30, 218, 220, 218,54
위와 같은 결과가 나와야 한다.
218, 220은 소수점이 나오지 않게 해야하기때문에 이렇게 만든 것이다. 결국 656이라는 숫자를 3분할 할때 218.6 이렇게 소수점이 나오지 않고, 이런 경우는 218,220,218 이렇게 해서 소수점이 나오지 않게 홀의 간격을 만드는 것이 중요한 알고리즘이다.

주어진 규칙에 따라 calculate_hole_positions_separated_lc035 함수를 작성하겠습니다. 이 함수는 LCD의 크기에 따라 중심점을 기준으로 왼쪽과 오른쪽에 홀을 배치합니다. 첫 번째 홀은 54부터 시작하고, 나머지 홀은 중심점 기준으로 각각 -15, +15에 배치됩니다. 그 후, 남은 영역을 균등하게 3분할 또는 4분할하여 추가 홀의 위치를 결정합니다.

주어진 LCD 길이에 따라 홀의 위치를 계산하는 알고리즘은 다음과 같습니다:

LCD의 중심을 찾습니다.
첫 번째 홀의 위치는 54, 마지막 홀의 위치는 LCD-54입니다.
중심점을 기준으로 -15, +15에 홀을 배치합니다.
남은 영역을 3분할 또는 4분할하여 홀의 위치를 계산합니다.
이 규칙에 따라 함수를 작성하겠습니다:

 

def calculate_hole_positions_separated_lc035(LCD):
    center = LCD // 2
    left_remaining = center - 54 - 15
    right_remaining = center - 54 - 15

    # 기본 홀 위치 설정
    positions = [54, center - 15, center + 15, LCD - 54]

    # 남은 영역 계산을 위한 함수
    def calculate_remaining_positions(remaining_length, side='left'):
        num_sections = 3 if remaining_length % 4 > remaining_length % 3 else 4
        section_length = remaining_length // num_sections
        adjustment = remaining_length % num_sections

        positions = []
        current_position = 54 if side == 'left' else LCD - 54

        for _ in range(num_sections):
            if adjustment > 0:
                positions.append(current_position + section_length + 1)
                current_position += section_length + 1
                adjustment -= 1
            else:
                positions.append(current_position + section_length)
                current_position += section_length

        return positions if side == 'left' else positions[::-1]

    # 왼쪽과 오른쪽 영역 계산
    left_positions = calculate_remaining_positions(left_remaining, 'left')
    right_positions = calculate_remaining_positions(right_remaining, 'right')

    return left_positions + positions + right_positions

# 예시로 LCD 값이 1450일 때의 결과
positions = calculate_hole_positions_separated_lc035(1450)
print(positions)

 

위의 코드로 실행하니 오류가 있어서 다시 코드를 수정했다.

def calculate_hole_positions_separated_lc035(LCD):
    # 중심 지점 계산
    center = LCD // 2

    # 중심으로부터의 고정 홀 위치
    fixed_holes = [54, center - 15, center + 15, LCD - 54]

    # 중심 왼쪽 남은 거리 계산
    remaining_left = center - 15 - 54

    # 남은 거리를 3분할 또는 4분할하는 함수
    def divide_remaining_distance(remaining_distance):
        # 간격이 200에서 250 사이가 되도록 분할 수 결정
        for div in range(3, 5):
            intervals = [remaining_distance // div] * (div - 1)
            intervals.append(remaining_distance - sum(intervals))
            if all(200 <= x <= 250 for x in intervals):
                return intervals
        return []

    # 왼쪽 간격 계산
    left_intervals = divide_remaining_distance(remaining_left)

    # 홀 위치 계산
    hole_positions = []
    current_position = 54
    for interval in left_intervals:
        current_position += interval
        if current_position not in fixed_holes:  # 중복 제거
            hole_positions.append(current_position)

    # 대칭적인 오른쪽 홀 위치 계산
    for interval in reversed(left_intervals):
        current_position = LCD - 54 - interval
        if current_position not in fixed_holes:  # 중복 제거
            hole_positions.append(current_position)

    # 중심 홀과 양쪽 홀 위치 결합 및 정렬
    return sorted(fixed_holes + hole_positions)

 

이 함수는 주어진 LCD 크기에 대해 지정된 규칙에 따라 홀의 위치를 계산하고, 결과적으로 홀 간격을 분할합니다. 위 예시 코드는 LCD 값이 1450일 때 홀의 위치를 계산하고 출력합니다.

반응형
댓글