[SWEA] 4366. 鄭植の銀行業務[D 4]


https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWMeRLz6kC0DFAXd&categoryId=AWMeRLz6kC0DFAXd&categoryType=CODE&problemTitle=%EC%A0%95%EC%8B%9D%EC%9D%B4%EC%9D%98&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

📖 に答える


入力したバイナリ数をxor演算でfor文に変換します.
そして10進数に変更して3進数に変更します.
3進数に変更した値を既存の3進数値と文字列ごとに比較した場合、差が1つしか現れない場合は、対応する10進数値が出力されます.

📒 コード#コード#

def binary_to_decimal():    # 2진수를 10진수로 변경(string => int)
    cnt = 1
    decimal = 0
    for c in two[::-1]:
        decimal += cnt * c
        cnt *= 2
    return decimal


def decimal_to_ternary(decimal):    # 10진수를 3진수 변경(int => string)
    result = ''
    while decimal >= 3:
        result = str(decimal % 3) + result
        decimal //= 3
    if decimal:
        result = str(decimal) + result
    return result


def func():
    for i in range(len(two)):
        two[i] = two[i] ^ 1                 # 2진수를 한 자리씩 변경
        decimal = binary_to_decimal()       # 2진수를 10진수로 변경
        ans = decimal_to_ternary(decimal)   # 10진수을 3진수으로 변경
        if len(ans) == len(three):          # 서로 길이가 같은 지 확인
            cnt = 0
            for j in range(len(three)):     # 다른 개수가 하나인지 확인
                if cnt == 2:                # 다른 개수가 2이상이면 break
                    break
                if ans[j] != three[j]:
                    cnt += 1
            else:                           # 다른 개수가 하나일 때 return
                if cnt == 1:
                    return decimal
        two[i] = two[i] ^ 1                 # 바꿔준 자리를 원상복구


for tc in range(1, 1 + int(input())):
    two = list(map(int, input()))
    three = input()
    print(f'#{tc} {func()}')

🔍 結果