▷ 오늘의 일정
09:10 ~ 10:10 |
코딩테스트 문제풀기 |
10:10 ~ 10:40 |
코드 리뷰 |
11:50 ~ 12:00 |
코딩테스트 보충 |
12:00 ~ 13:00 |
점 심 식 사 :) |
13:00 ~ 18:00 |
장고 강의 듣기 2주차까지! 노오력 |
18:00 ~ 19:00 |
저 녁 식 사 :) |
19:00 ~ 20:40 |
하루 공부 내용 정리 및 TIL |
20:40 ~ 21:00 |
하루 공부 내용 공유 |
▷ 오늘의 배움
- 반복문으로 2차원 배열 만들기 / 이중반복문 사용
a = [] # 빈 리스트 생성
for i in range(3): # 생성할 안쪽 리스트의 개수(반복문을 한번 돌때마다 한개의 안쪽 리스트가 만들어진다)
line = [] # 안쪽 리스트로 사용할 빈 리스트 생성
for j in range(2): # 안쪽 리스트의 요소 개수(반복문을 한번 돌때마다 요소가 추가된다.)
line.append(0) # 안쪽 리스트에 0 추가
a.append(line) # 안쪽 리스트에 요소를 다 채웠으면 전체 리스트에 안쪽 리스트를 추가
print(a) # [[0, 0], [0, 0], [0, 0]]
- dictionary_name.keys()
- 딕셔너리 dictionary_name의 key만을 모아서 dict_keys 객체를 리턴한다.
- dict_keys 객체는 리스트를 사용하는 것과 큰 차이는 없지만, 리스트 고유의 append, insert, pop, remove, sort 함수는 수행할 수 없다.
- dictionary_name.values()
- key를 얻는 것 과 마찬가지로 value만을 모아서 dict_values 객체를 돌려준다.
- dictionary_name.items()
- items 함수는 key와 value의 쌍을 튜플로 묶은 값을 dict_items 객체로 돌려준다.
- collections
- itetools
▷ 오늘의 시도
# 문제 설명
# 0과 1로만 이루어진 문자열이 주어졌을 때, 이 문자열에 있는 모든 숫자를 전부 같게 만들려고 한다.
# 할 수 있는 행동은 문자열에서 연속된 하나 이상의 숫자를 잡고 모두 뒤집는 것이다.
# 뒤집는 것은 1을 0으로, 0을 1로 바꾸는 것을 의미한다.
# 예를 들어 S=0001100 일 때, 전체를 뒤집으면 1110011이 된다.
# 주어진 문자열을 모두 0 혹은 모두 1로 같게 만드는 최소 횟수를 반환하시오.
# 최소로 뒤집는 기준은 무엇이 될까
# 연속된 숫자가 많을 수록 뒤집는 횟수는 줄어들지 않을까
# 연속된 숫자의 횟수는 어떻게 판별하지
# 앞의 숫자와 뒤의 숫자가 다르다면 뒤집는 기준점이 될텐데,, 이걸 어떻게 하면 좋을까
# 먼저 앞과 뒷 번호가 다른 부분의 횟수를 세어보자.
string = '010101'
count = 0
for i, a in enumerate(string):
if string[i] != string[i+1]:
count += 1
# 음.. 이렇게 짜주면 마지막 숫자인 경우 i+1에서 오류가 발생한다.
# 그러면 마지막 자리까지만 계산이 될 수 있게끔 인덱스 값을 하나 줄여보자
# 횟수만 계산하면 되기 때문에 enumerate를 사용 안해도 될 것 같다.
string = '010101'
count = 0
for i in range(len(string)-1):
if string[i] != string[i+1]:
count += 1
# 010101일 때 5번의 횟수가 뜨는데 흐으음
# 어떻게 구분을 지어주는 게 좋을까?
# 경우는 두가지 이다. 모두 0으로 만들던가 모두 1로 만들던가.
# 그럼 위에 반복문을 사용해 모두 0으로 만드는 경우에 수와 모두 1로 만드는 경우의 수를 세어봐야겠다.
count_zero = 0
count_one = 0
# 어떨 때 횟수를 세야하는 지 조건이 필요하다.
# 뒤집는 포인트를 찾았다면, 아! 그 다음 숫자가 1이면은 0으로 뒤집어야 하고 0이면은 1로 뒤집어야 하는 거 아닐까?
# 앞과 똑같은 숫자를 만들어야 하니 말이다.
# 자 보자 모두 0으로 만들어야 한다면 모든 1을 뒤집어야 한다. 모두 1로 만드는 것도 마찬가지다.
# 그러니 다음 숫자가 1일 때 모두 0으로 만드는 변수에다 더하기 1을 해주가 0일때는 모두 1로 만드는 변수에다 더하기 1을 해준다.
for i in range(len(string) - 1):
if string[i] != string[i + 1]:
if string[i+1] == '0':
count_one += 1
if string[i+1] == '1':
count_zero += 1
# 흐음 string = '011110'일 때 둘다 1로 나온다 왜일까. 뭐가 빠졌을까.
# 1로 바꿀려고 할때 하나를 더 세야한다. 아아아앗
# 지금 보면 i+1이 무슨 숫자이냐에 따라 카운트를 해주었다. 아무도 첫번째 숫자가 무엇인지는 따지지 않았다!!!!
# 아하 그러면 첫번째 숫자가 무엇인지에 대한 판단도 필요하겠다.
if string[0] == '0':
count_one += 1
if string[0] == '1':
count_zero += 1
# 으음 이 조건문은 반복문이 돌기전에 먼저 판별하고 다음 숫자들의 판별은 반복문에서 할 수 있게끔 하는게 좋을 것 같다.
# 반복문에 넣으려고 하면 i가 0일 때를 넣어야 하는데 조건문을 넣고 또 거기서 0일때 1일때의 조건을 달아야한다.
# 반복문이 너무 길고 복잡해지는 것 같다. 어차피 첫번째 자리만 판별하면 되니까~
# 그렇게 완성된 최종 함수
input = "011110"
def find_count_to_turn_out_to_all_zero_or_all_one(string):
count_zero = 0
count_one = 0
if string[0] == '0':
count_one += 1
if string[0] == '1':
count_zero += 1
for i in range(len(string) - 1):
if string[i] != string[i + 1]:
if string[i + 1] == '0':
count_one += 1
if string[i + 1] == '1':
count_zero += 1
# 끝인 줄 알았지만 끝이 아니다. 횟수를 센 변수 중에 작은 값을 반환해줘야 한다.
return min(count_zero, count_one)
#최종 완성_진짜 최종
result = find_count_to_turn_out_to_all_zero_or_all_one(input)
print(result)