[SWEA] #4530 극한의 청소작업

wonyu·2021년 12월 16일
0

algorithm

목록 보기
11/25

문제 링크

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWO6cgzKOIEDFAWw

풀이 방법

  • 처음에 계획했던 풀이 방법
  1. A, B 각각 일의 자리부터 십의 자리, 백의 자리 ... 순서로 4가 있는 층 카운트
  2. A만 음수일 경우 0층 처리
    -> 1번부터 막힘. 4층을 카운트 했을 때 44층에 대해서는 십의 자리로 칠 건지 일의 자리로 칠 건지도 고민되었고, 이렇게 겹치는 부분이 있을 때 자릿수가 커지면 어떻게 처리해야 할 지 방법이 생각이 안 났음.
    일의 자리에 대해 4 처리하고, 십의 자리에 대해 14, 24, ... 처리한다고 했을 때 개수의 규칙성이 보이지 않았음.
  • 다른 사람의 풀이법 참고한 것
    위에서 계획했던 방법과의 차이점은 4를 제외한 층을 카운트한다는 것. 이렇게 할 경우 1~10 단위로 끊어서 봤을 때 셀 수 있는 층수가 9개로 규칙성 존재.

코드

def calc_floor(x):
    '''
    4가 들어가는 층을 제외하고 카운트
    ex) 110
    101~110의 경우: 101, 102, 103, 105, 106, 107, 108, 109, 110 => 9개
    1~100의 경우: 1~10, 11~20, 21~30, 31~39, 50~60, 61~70, 71~80, 81~90, 91~100, 101~110 => 9개*9 => 9 ** 2
    '''
    square = 0
    floors = 0
    while x > 0:
        x, remainder = divmod(x, 10)
        floors += (remainder - 1) * (9 ** square) if remainder >= 4 else remainder * (9 ** square)
        square += 1
    return floors


T = int(input())
for tc in range(1, T+1):
    A, B = map(int, input().split())

    a = calc_floor(abs(A))
    b = calc_floor(abs(B))

    if A < 0 < B:
        result = a + b - 1  # 0층 빼줌
    else:
        result = abs(b - a)

    print('#{} {}'.format(tc, result))

0개의 댓글