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 |