Tany
백문이불어일Tany
Tany
전체 방문자
오늘
어제
  • 분류 전체보기 (197)
    • JAVA TPC (1)
    • JAVA (10)
    • CS (3)
    • SPRING (5)
    • DFS BFS (12)
    • SQL (7)
    • 알고리즘 정리 (76)
    • Git, Github (3)
    • 학습 계획 (36)
    • 코드스쿼드 학습일지 (19)
    • Servlet (5)
    • VPC (2)
    • AWS (4)
    • JPA (5)
    • 취미생활 (2)
    • 프로젝트 기록 (7)
      • Issue Tracker 삽질 기록 (5)
      • 당근마켓 API 서버 기록 (2)
      • 나만의 블로그 제작 기록 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 이분탐색
  • 이코테
  • 재귀
  • java
  • EC2
  • 해시
  • AWS
  • 정렬
  • BFS
  • 인프런
  • 프로그래머스
  • dfs
  • JSP
  • 알고리즘
  • 자료구조
  • Stack
  • hash
  • JPA
  • GIT
  • sql
  • MySQL
  • 완전탐색
  • 문자열
  • 파이썬
  • github
  • 면접을 위한 CS 전공지식 노트
  • 백준
  • MVC
  • 자바
  • 주간 학습 계획

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Tany

백문이불어일Tany

파이썬(Python) 알고리즘 문제풀이 이진 변환 반복하기 [프로그래머스 / 문자열]
알고리즘 정리

파이썬(Python) 알고리즘 문제풀이 이진 변환 반복하기 [프로그래머스 / 문자열]

2023. 5. 28. 16:02

출처) 프로그래머스 Facebook

문제 설명

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.

x의 모든 0을 제거합니다.
x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.

0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

 

제한사항

s의 길이는 1 이상 150,000 이하입니다.
s에는 '1'이 최소 하나 이상 포함되어 있습니다.

 

 

입출력 예시

s result
"110010101001" [3,8]
"01110" [3,3]
"1111111" [4, 1]

 

 

풀이 코드

문제에서 시키는 대로 하면 풀렸던 문제. 문자열을 직접 조작하는 것 보다는 간단한 아이디어로 금방 풀 수 있었다. 직접 조작해 갱신된 문자열에서 제거된 '0' 을 찾고 '1' 이 몇 개인지 찾는 것 보다, 문자열의 길이를 2진법으로 변환하고 하면 된다고 하니까, 길이를 구할 수만 있다면 간단하게 풀 수 있다. 정리하자면,

  1. '0' 을 모두 제거한다.
  2. 남은 '1' 의 개수를 c 라고 하고, c 를 2진수로 변환한다.
  3. s 가 1 이 될 때 까지 반복한다.

반환해야하는 값은 [몇 번 이진 탐색이 되었는지 횟수, 지워진 '0'의 개수] 이므로 call_func_count, removed_zero_count 라는 변수를 두었고, call_func_count 의 경우 while 문이 실행될 때 마다 하나 씩 증가하는 식으로, removed_zero_count 의 경우 직접 세는게 아니라 문자열 s 의 '1' 의 개수를 센 뒤 전체 문자열 s 의 길이에서 빼준 값을 더해주는 방식으로 구현했다. 왜냐면 2번 과정에서 어짜피 '1' 의 개수 값으로 2진수로 변환하기 때문에 필요한 값이기도 하니까.

def solution(s):
    answer = []

    call_func_count = 0
    removed_zero_count = 0

    while s != '1':
        call_func_count += 1

        s_len = len(s)
        c = s.count('1')
        removed_zero_count += (s_len - c)

        s = bin(c)[2:]

    answer.append(call_func_count)
    answer.append(removed_zero_count)

    return answer

'알고리즘 정리' 카테고리의 다른 글

파이썬(Python) 알고리즘 문제풀이 하노이의 탑 [프로그래머스 / 문자열]  (0) 2023.05.29
파이썬(Python) 알고리즘 문제풀이 신규 아이디 추천 [프로그래머스 / 문자열]  (0) 2023.05.28
파이썬(Python) 알고리즘 문제풀이 해쉬 [프로그래머스 / 문자열]  (0) 2023.05.25
파이썬(Python) 알고리즘 문제풀이 문자열 압축 [프로그래머스 / 문자열]  (0) 2023.05.25
파이썬(Python) 알고리즘 문제풀이 짝지어 제거하기 [프로그래머스 / 문자열]  (0) 2023.05.25
    '알고리즘 정리' 카테고리의 다른 글
    • 파이썬(Python) 알고리즘 문제풀이 하노이의 탑 [프로그래머스 / 문자열]
    • 파이썬(Python) 알고리즘 문제풀이 신규 아이디 추천 [프로그래머스 / 문자열]
    • 파이썬(Python) 알고리즘 문제풀이 해쉬 [프로그래머스 / 문자열]
    • 파이썬(Python) 알고리즘 문제풀이 문자열 압축 [프로그래머스 / 문자열]
    Tany
    Tany
    내가 보려고 만드는 백엔드 기록장 Github https://github.com/juni8453

    티스토리툴바