본문 바로가기
Algorithm

[프로그래머스] 알고리즘 난이도 중하 8문제 (Python) -3

by Baest 2022. 2. 12.

 

1) 이상한 문자 만들기

https://programmers.co.kr/learn/courses/30/lessons/12930

 

코딩테스트 연습 - 이상한 문자 만들기

문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을

programmers.co.kr

 

처음에 코드 실행은 통과 됐는데, 채점하면 18점이었다.

질문하기에 다른 분이 남긴 테스트 코드 추가해서 다시 확인했다.

 

Parameters: "sp ace"

Return: "Sp AcE"

 

def solution(s):
    answer = ""
    space = 0
    for i in range(len(s)):
        if(s[i] == " "): # 공백일 때
            answer += " "
            space = 0
        else:
            if(space % 2 == 0):
                answer += s[i].upper()
                space += 1
            else:
                answer += s[i].lower()
                space += 1
    if(i < len(s)-1):
        answer += " "
    return answer

 

 

2) 자릿수 더하기

https://programmers.co.kr/learn/courses/30/lessons/12931

 

코딩테스트 연습 - 자릿수 더하기

자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요. 예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다. 제한사항 N의 범위 : 100,000,000 이하의 자연수 입출

programmers.co.kr

*방법1

def solution(n):
    answer = 0
    strN = str(n)
    arr = []
    for i in range(len(strN)):
        arr.append(strN[i])
    for i in range(len(arr)):
        answer += int(arr[i])
    return answer

*방법2

def solution(n):
    tot = sum(map(int, list(str(n))))
    return tot

 

 

3) 자연수 뒤집어 배열로 만들기

https://programmers.co.kr/learn/courses/30/lessons/12932

 

코딩테스트 연습 - 자연수 뒤집어 배열로 만들기

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다. 제한 조건 n은 10,000,000,000이하인 자연수입니다. 입출력 예 n return 12345

programmers.co.kr

 

def solution(n):
    temp = []
    answer = []
    for i in str(n)[::-1]: # 역순으로
        temp.append(i)
    for i in range(len(temp)):
        answer.append(int(temp[i]))
    return answer

 

 

4) 정수 내림차순으로 배치하기

https://programmers.co.kr/learn/courses/30/lessons/12933

 

코딩테스트 연습 - 정수 내림차순으로 배치하기

함수 solution은 정수 n을 매개변수로 입력받습니다. n의 각 자릿수를 큰것부터 작은 순으로 정렬한 새로운 정수를 리턴해주세요. 예를들어 n이 118372면 873211을 리턴하면 됩니다. 제한 조건 n은 1이

programmers.co.kr

-  런타임 에러 발생1 (2, 3, 11에서)

import math
def solution(n):
    answer = ""
    max = 0;
    list = []
    for i in str(n):
        list.append(i)
    for i in range(len(list)):
        for j in range(i):
            if(int(list[i]) > int(list[j])):
                list[i], list[j] = list[j], list[i]        
    for i in range(len(list)):
        answer += list[i]        
    return int(answer)

 

-  런타임 에러 발생2 (2, 3, 11에서)

 

def solution(n):
    numList = list(str(n))   
    numList.sort(reverse = True)
    return int("".join(numList))

 

 

*정답코드

def solution(n):
    n = int(n) # 이거 안해주면 2,3,11 런타임에러
    n = list(str(n))   
    n.sort(reverse = True)
    return int("".join(n))

 

 

5) 정수 제곱근 판별

https://programmers.co.kr/learn/courses/30/lessons/12934

 

코딩테스트 연습 - 정수 제곱근 판별

임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다. n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함

programmers.co.kr

 

*방법1

import math
def solution(n):
    x = math.sqrt(n)
    temp = str(x).split(".") # 소수점 기준으로 split ex) 11.0일 경우 ["11", "0"]
    if(temp[1] == "0"):      # 소수점 이하가 0일 경우 정수 부분만 x로 바꿈
        x = int(temp[0]) 
    if(type(x) == int):
        return (x+1) * (x+1)
    else:
        return -1

 

*방법2 (22/02/14 업데이트)

- math.trunc 사용하여 값 x를 Integral로 자른 값 반환

참고: https://docs.python.org/ko/3/library/math.html

 

math — 수학 함수 — Python 3.10.2 문서

math — 수학 함수 이 모듈은 C 표준에서 정의된 수학 함수에 대한 액세스를 제공합니다. 이 함수는 복소수와 함께 사용할 수 없습니다; 복소수를 지원해야 하면 cmath 모듈에 있는 같은 이름의 함

docs.python.org

import math
def solution(n):
    x = math.trunc(math.sqrt(n))
    if(x*x == n):
        return (x+1) * (x+1)
    else:
        return -1

 

 

6) 제일 작은 수 제거하기

https://programmers.co.kr/learn/courses/30/lessons/12935

 

코딩테스트 연습 - 제일 작은 수 제거하기

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1

programmers.co.kr

 

def solution(arr):
    min = 10000;
    for i in arr:
        if(i < min):
            min = i
    arr.remove(min)
    if(len(arr) == 0):
        arr.append(-1)
    return arr

 

 

7) 콜라츠 추측

https://programmers.co.kr/learn/courses/30/lessons/12943

 

코딩테스트 연습 - 콜라츠 추측

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다. 1-1. 입력된 수가 짝수라면 2

programmers.co.kr

 

def solution(num):
    answer = 0; cnt = 0
    while(num != 1):
        if(cnt > 500):
            return -1
        if(num % 2 == 0):
            num = int(num / 2)
        else:
            num = int(num * 3 + 1)
        cnt+=1    
    return cnt

 

 

8) 하샤드 수

https://programmers.co.kr/learn/courses/30/lessons/12947

 

코딩테스트 연습 - 하샤드 수

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하

programmers.co.kr

 

import math
def solution(x):
    tot = sum(map(int, list(str(x)))) # 각 자릿수 합산
    if(x % tot == 0):
        return True
    else:
        return False