SWEA_4366_정식이의 은행 업무

김병훈·2021년 4월 16일
0

아이디어 1

  • 주어진 2진수에서 한 자리씩 바꿔가며 모든 경우의 수를 만들어본다.

  • 주어진 3진수에서 한 자리씩 바꿔가며 모든 경우의 수를 만들어본다.

  • 만들어진 2진수의 모든 경우의 수를 10진수로 변환한다.

  • 3진수의 모든 경우의 수를 10진수로 변환하며, 2진수의 10진수 목록에서 일치하는 값이 있는 지 탐색한다.

def binary_to_decimal(binary):
    result = 0
    for i in range(len(binary)):
        result += binary[i] * (2 ** (len(binary) - 1 - i))
    return result

def ternary_to_decimal(ternary):
    result = 0
    for i in range(len(ternary)):
        result += ternary[i] * (3 ** (len(ternary) - 1 - i))
    return result

T = int(input())

for tc in range(1, T + 1):
    answer = 0
    ORIGIN_BINARY = list(map(int, input()))
    ORIGIN_TERNARY = list(map(int, input()))

    binary_decimal_list = []
    for b_idx in range(len(ORIGIN_BINARY)):
        temp1 = ORIGIN_BINARY[:]
        temp2 = ORIGIN_BINARY[:]
        temp1[b_idx] = 0
        temp2[b_idx] = 1
        binary_decimal_list.append(binary_to_decimal(temp1))
        binary_decimal_list.append(binary_to_decimal(temp2))

    # print(binary_list)
    # print(binary_decimal_list)
    binary_decimal_list = list(set(binary_decimal_list))
    # print(binary_decimal_list)

    for t_idx in range(len(ORIGIN_TERNARY) - 1, -1, -1):
        temp_list = []
        for i in range(3):
            temp = ORIGIN_TERNARY[:]
            temp[t_idx] = i
            ternary_decimal = ternary_to_decimal(temp)
            if ternary_decimal in binary_decimal_list:
                answer = ternary_decimal
                break
        if answer:
            break
    print(f"#{tc} {answer}")

Binary 부분도 for문으로 정리하면, 코드가 더 깔끔해진다.

def binary_to_decimal(binary):
    result = 0
    for i in range(len(binary)):
        result += binary[i] * (2 ** (len(binary) - 1 - i))
    return result

def ternary_to_decimal(ternary):
    result = 0
    for i in range(len(ternary)):
        result += ternary[i] * (3 ** (len(ternary) - 1 - i))
    return result

T = int(input())

for tc in range(1, T + 1):
    answer = 0
    ORIGIN_BINARY = list(map(int, input()))
    ORIGIN_TERNARY = list(map(int, input()))

    binary_decimal_list = []
    for b_idx in range(len(ORIGIN_BINARY)):
        for i in range(2):
            temp = ORIGIN_BINARY[:]
            temp[b_idx] = i
            binary_decimal_list.append(binary_to_decimal(temp))

    binary_decimal_list = list(set(binary_decimal_list))

    for t_idx in range(len(ORIGIN_TERNARY) - 1, -1, -1):
        temp_list = []
        for i in range(3):
            temp = ORIGIN_TERNARY[:]
            temp[t_idx] = i
            ternary_decimal = ternary_to_decimal(temp)
            if ternary_decimal in binary_decimal_list:
                answer = ternary_decimal
                break
        if answer:
            break
    print(f"#{tc} {answer}")

다른 멋진 분들의 코드🙂

1. int 함수의 활용법을 알게 한 코드

T = int(input())
for testcase in range(1,T+1):
    binary = input()
    ternary = input()
 
    binary_list = []
    ternary_list = []
 
# binary 한 자리 바꾸고
# ternary 한 자리 바꿨을 때
# 값이 같은지 비교해보기
 
    for i in range(len(binary)):
        binary_tmp = list(binary)
        if binary_tmp[i] == '0':
            binary_tmp[i] = '1'
            binary_list.append(int(''.join(binary_tmp), 2))
 
        elif binary_tmp[i] == '1':
            binary_tmp[i] = '0'
            binary_list.append(int(''.join(binary_tmp), 2))
 
    for j in range(len(ternary)):
        ternary_tmp = list(ternary)
        if ternary_tmp[j] == '0':
            ternary_tmp[j] = '1'
            ternary_list.append(int(''.join(ternary_tmp), 3))
            ternary_tmp[j] = '0'
            ternary_tmp[j] = '2'
            ternary_list.append(int(''.join(ternary_tmp), 3))
 
        elif ternary_tmp[j] == '1':
            ternary_tmp[j] = '0'
            ternary_list.append(int(''.join(ternary_tmp), 3))
            ternary_tmp[j] = '1'
            ternary_tmp[j] = '2'
            ternary_list.append(int(''.join(ternary_tmp), 3))
 
        elif ternary_tmp[j] == '2':
            ternary_tmp[j] = '0'
            ternary_list.append(int(''.join(ternary_tmp), 3))
            ternary_tmp[j] = '2'
            ternary_tmp[j] = '1'
            ternary_list.append(int(''.join(ternary_tmp), 3))
 
    for b in binary_list:
        for t in ternary_list:
            if b == t:
                result = b
 
    print("#{} {}".format(testcase, result))

처음에 이 코드를 보고, '응? 2진수랑 3진수랑 바로 리스트에 넣어서 비교하는데 코드가 동작한다고?'라는 생각을 했다.

다시 코드를 꼼꼼히 살펴보니 int 함수에 두번째 인자로 2와 3을 넣어주는 것을 보고 머리가 띵해졌었다.

수업 초반에 잠깐 봤었던 것 같기도 한데, int는 진수 변환도 가능하다.

느낀점😎

  • 어떻게 풀지 정리하고 접근을 하니 한결 코드 짜는 흐름이 원활했다.

  • int 함수의 활용법

    • int(변환할 대상, 대상의 진수)

    • int를 통해 문자만 숫자형으로 바꿨었지, 2진수를 변환할 생각은 못했었는데 이번 코드를 보고 하나 배울 수 있었다.

	a = int("101", 2)
	print(a)	# 5
	b = int("101", 3)
	print(b)	# 10
profile
재밌는 걸 만드는 것을 좋아하는 메이커

0개의 댓글