[프로그래머스] Lv.2 최댓값과 최솟값/JadenCase 문자열 만들기/최솟값 만들기/이진 변환 반복하기 (Python)

seulzzang·2022년 10월 17일
0

코딩테스트 연습

목록 보기
30/44
post-thumbnail

1. 최댓값과 최솟값

[프로그래머스] Lv.2 최댓값과 최솟값

📍 풀이

def solution(s):
    answer = ''
    # s에는 둘 이상의 정수가 공백으로 구분되어 있다
    nums = s.split()
    new_nums = []
    for num in nums:
        new_nums.append(int(num))
    answer += '{0} {1}'.format(min(new_nums), max(new_nums))
    return answer

문자열로 나열된 숫자들을 int형으로 변환해주고 이를 new_nums에 담아준다. 이후 그 최댓값과 최솟값을 answer에 담아주면 끝

📍 다른사람 풀이

def solution(s):
    s = list(map(int,s.split()))
    return str(min(s)) + " " + str(max(s))

map을 사용하여 간결해짐!

2. JadenCase 문자열 만들기

[프로그래머스] Lv.2 JadenCase 문자열 만들기

📍 풀이

def solution(s):
    # capitalize() : 맨 첫글자만 대문자로 변환
    answer = ''
    s = s.split(' ')
    for i in range(len(s)):
        s[i] = s[i].capitalize()
    answer = ' '.join(s)
    return answer

이 문제.. 그냥 split()을 쓰면 테스트케이스 몇몇개에서 오답이 뜬다.
찾아보니 split()은 공백이 몇개든 상관 없이 모든 공백을 하나로 처리하며, split(' ') 문자열 사이사이에 있는 공백만 배열의 분할점으로 이용하되, 공백이 연속하여 나오면 일반 문자 다음에 오는 공백 각각을 하나의 리스트 요소로 처리한다.

다시보니 제한 조건에... 공백문자가 연속해서 나올 수 있습니다.가 존재..!!
제한조건을 꼼꼼하게 읽도록 하자..🤯

3. 최솟값 만들기

[프로그래머스] Lv.2 최솟값 만들기

📍 풀이

  • 일전에 알고리즘 스터디에서 풀었던 문제
  • 곱의 누적 합이 최소값이 되려면 A의 가장 큰 값 * B의 가장 작은 값으로 계산해서 누적 합을 구해주면 된다.
  • 따라서 A는 내림차순 정렬, B는 오름차순 정렬을 한 뒤 A의 길이 만큼 반복문을 돌면서 누적 합을 구해주면 된다. (A와 B의 길이는 같다.)
def solution(A,B):
    answer = 0
    A.sort(reverse = True)
    B.sort()
    for i in range(len(A)):
        answer += (A[i] * B[i])
    return answer

4. 이진 변환 반복하기

[프로그래머스] Lv.2 이진 변환 반복하기

📍 풀이

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
1. x의 모든 0을 제거합니다.
2. x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.

  • 제거된 모든 0의 개수를 구하기 위해 처음의 s에서 s.count('0')을 이용해 개수를 세준다. 이를 zerocnt에 누적해서 더해준다.
  • s에서 '0'을 공백으로 치환한다.
  • '0'이 공백으로 치환된 sbin함수로 2진수를 구해준 뒤, 2번째 인덱스부터 저장을 해준다. (bin을 사용할 경우 0b1101과 같이, 앞에 0b가 붙은 상태로 반환되기 때문)
  • 이 과정이 이진 변환 과정 1번 이므로, cnt += 1로 이진 변환 횟수를 더해준다.
  • s에 1만 남을 때 까지 반복해준다.
def solution(s):
    cnt = 0 # 이진 변환 횟수
    zerocnt = 0 # 제거된 모든 0의 개수
    while True:
        if s == '1':
            break
        cnt2 = s.count('0')
        zerocnt += cnt2
        s = s.replace('0', '')
        s = bin(len(s))[2:]
        cnt += 1
        
    answer = [cnt, zerocnt]
    return answer

📍 다른사람 풀이

def solution(s):
    a, b = 0, 0
    while s != '1':
        a += 1
        num = s.count('1')
        b += len(s) - num
        s = bin(num)[2:]
    return [a, b]

어차피 0과 1로만 이루어진 문자열이니 len(s) - len(문자열 내 1의 개수)를 하면 사라진 0의 개수도 나온다. 나처럼 zerocnt를 따로 구해줄 필요가 없었던 것..!

profile
중요한 것은 꺾이지 않는 마음

0개의 댓글