Algorithm/SWEA

[swea] 4366. 정식이의 은행업무 python

DongKeun2 2022. 3. 25. 17:19

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

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

🔥 작성코드

# 한 자리를 바꾼 2진수와 3진수 값 x, y
def check(x, y):
    global result, flag

    # 같다면 x,y가 정답
    if x == y:
        result = x
        flag = 1
        return


# 2진수 한 자리를 바꾼 10진수 x, 3진수의 자리 i
def sol(x, i):
    global flag

    # 3진수의 자리수보다 i가 커지면 더 이상 바꾸지 않아도 되므로 종료
    if i >= len(n3):
        return

    elif flag:
        return

    # 확인하는 3진수의 자리값이 0, 1, 2 일때 각각 변경햐여 check 함수로 넘김
    if n3[-(i+1)] == '0':
        check(x, num3 + tmp3[i])
        check(x, num3 + 2 * tmp3[i])
    elif n3[-(i+1)] == '1':
        check(x, num3 - tmp3[i])
        check(x, num3 + tmp3[i])
    else:
        check(x, num3 - tmp3[i])
        check(x, num3 - 2 * tmp3[i])

    # 다음 자리도 바꿔서 확인
    sol(x, i + 1)


T = int(input())

tmp2 = [2 ** i for i in range(40)]
tmp3 = [3 ** i for i in range(40)]

for test_case in range(1, T + 1):
    n2 = input()
    n3 = input()

    # 2진수 => 10진수
    num2 = 0
    for i in range(len(n2))[::-1]:
        if n2[i] == '1':
            num2 += 2 ** (len(n2) - i - 1)

    # 3진수 => 10진수
    num3 = 0
    for i in range(len(n3))[::-1]:
        if n3[i] != '0':
            num3 += int(n3[i]) * 3 ** (len(n3) - i - 1)

    # 2진수를 자리마다 하나씩 바꿔서 확인하기 위해 sol함수로 보냄
    flag = 0
    for i in range(len(n2)):
        if flag:
            break

        if n2[-(i + 1)] == '1':
            x = num2 - tmp2[i]
        else:
            x = num2 + tmp2[i]

        sol(x, 0)

    print(f'#{test_case} {result}')

 

⭕ 해설

  1. 완전탐색을 이용하여 풀었습니다.
  2. 입력받은 2진수와 3진수를 각각 10진수로 변환합니다.
  3. 각 자리수를 바꿨다고 가정하고 10진수를 다시 구해줍니다.
    • 만약 2진수 입력값이 1010이면, 1010의 값 10을 미리 저장해 둡니다.
    • 그 뒤에 1010을 확인하며 1이라면 그 자릿값을 빼주고 0이라면 더해줍니다.
    • 2의 0승 자리 값이 0이므로 10에 1을 더한 11
    • 2의 1승 자리 값이 1이므로 10에 2를 뺀 8
    • 이런 식으로 11, 8, 14, 2를 넘겨줍니다. (앞자리를 0으로 바꿔도 되는지 몰라서 포함시켰습니다.)
  4. 입력받은 3진수도 앞의 과정을 거쳐 둘을 비교합니다.