ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 4월 4일 TIL - 2차원 배열, 숫자 뒤집기
    TIL(Today I Learned) 2023. 4. 5. 09:05

    ▷ 오늘의 일정

    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)

     

     

    댓글

Designed by Tistory.