본문 바로가기

개발일지/TIL

TIL 23-04-03

1. 스파르타 알고보면 알기쉬운 알고리즘 강의 - 1주차 숙제 

 문제점

input = "011110"

def find_count_to_turn_out_to_all_zero_or_all_one(string):
result = find_count_to_turn_out_to_all_zero_or_all_one(input)
print(result)

최소한으로 숫자를 뒤집는 방법을 알고리즘으로 만들어야 한다.

 시도해 본 것들

    # 0으로 뒤집은 경우, 1로 뒤집은 경우를 세기 위한 count
    # for문을 돌면서 0이면 1로, 1이면 0으로 바꾸는 for문 각각 작성
   # 밑에서 for문으로 if i == i[+1]: 바꾸고 아니면 break같은 방법

def find_count_to_turn_out_to_all_zero_or_all_one(string):
    # 0으로 뒤집은 경우, 1로 뒤집은 경우를 세기 위한 count,
    # for문을 돌면서 0이면 1로, 1이면 0으로 바꾸는 for문 각각 작성
    # 밑에서 for문으로 if i == i[+1]: 바꾸고 아니면 break같은 방법
    zero_count = 0
    zero_str = ''
    one_count = 0
    one_str = ''
    # 1일 경우 0으로 바꾸는 for문
    for idx, val in enumerate(string):
        print(idx, val)
        print(string[idx])
        print(type(val))
        # 0_str에 추가
        if val == '1':
            zero_str += '0'
        else:
            zero_count += 1
        pass
    return zero_str, zero_count

연속되는 경우를 파악하지 못함

 

input_ = "011110"

split_test0 = input_.split('0')
split_test1 = input_.split('1')

print(split_test0) # ['', '1111', '']
print(split_test1) # ['0', '', '', '', '0']

방향성이 잘못 된것 같아서 고민하다가 .split()을 찍어보고 코드를 전부 갈아엎었다.

 

input_ = "011110"
zero_list = string.split('1')
    print(zero_list) # ['0', '', '', '', '0']
# 1이 연속 되면서 나타는 ''제거
    zero_list = ' '.join(zero_list).split()
    print(zero_list) # ['0', '0']
    
    zero_list1 = ' '.join(zero_list)
    print(zero_list1) # 0 0

 해결 방법

input_ = "011110"
input1 = "010001000110"
input2 = "01111"
input3 = "10111101"


def find_count_to_turn_out_to_all_zero_or_all_one(string):
    # 0을 1로 뒤집기
    zero_list = string.split('1')
    print(zero_list)
    # 1이 연속 되면서 나타는 ''제거
    zero_list = ' '.join(zero_list).split()
    print(zero_list)
    # 0을 1로 뒤집을 수
    zero_count = len(zero_list)
    print(zero_count)

    # 1을 0으로 뒤집기
    one_list = string.split('0')
    print(one_list)
    # 0이 연속 되면서 나타는 ''제거
    one_list = ' '.join(one_list).split()
    print(one_list)
    # 1을 0로 뒤집을 수
    one_count = len(one_list)
    print(one_count)

    # 0을 뒤집는 게 더 횟수가 적다면
    if zero_count < one_count:
        return print(f'0을 1로 {zero_count}번 뒤집는 게 가장 좋다.')
    elif one_count < zero_count:
        return print(f'1을 0으로 {one_count}번 뒤집는 게 가장 좋다.')
    else:
        return print(f'무엇을 뒤집어도 {zero_count} 번 걸린다.')

result = find_count_to_turn_out_to_all_zero_or_all_one(input_) # 1을 0으로 1번
result = find_count_to_turn_out_to_all_zero_or_all_one(input1) # 1을 0으로 3번
result = find_count_to_turn_out_to_all_zero_or_all_one(input2) # 아무거나 1번
result = find_count_to_turn_out_to_all_zero_or_all_one(input3) # 0을 1로 3번

 알게 된 점

join 사용하긴 했지만 for문 없이 코드를 만들 수 있었다.

 

 

'개발일지 > TIL' 카테고리의 다른 글

TIL 23-04-05  (0) 2023.04.05
TIL 23-04-04  (0) 2023.04.04
TIL 23-04-02  (0) 2023.04.02
TIL 23-04-01  (0) 2023.04.01
TIL 23-03-31  (0) 2023.04.01