coding 연습/프로그래머스

프로그래머스 level1 쉬운 문제들(정답률70%이상)

blackbearwow 2023. 9. 24. 17:16

- 평균 구하기

def solution(arr):
    return sum(arr) / len(arr)

- 약수의 합

n이 0일 때와 1일 때 예외 처리를 해주어야 한다.

def solution(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    answer = 1 + n
    for x in range(2, n):
        if n % x == 0:
            answer += x
    return answer

- x만큼 간격이 있는 n개의 숫자

def solution(x, n):
    answer = []
    if x == 0:
        answer = [0]*n
    else:
        answer = [x for x in range(x, x*(n+1), x)]
    return answer

- 자릿수 더하기

def solution(n):
    answer = 0
    while n > 0:
        answer += n % 10
        n = n // 10
    return answer

- 짝수와 홀수

def solution(num):
    if num % 2 == 0:
        return "Even"
    else:
        return "Odd"

- 나머지가 1이 되는 수 찾기

def solution(n):
    answer = 0
    for i in range(2, n):
        if n % i == 1:
            answer = i
            break
    return answer

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

def solution(n):
    answer = str(n)
    answer = answer[::-1]
    return [int(x) for x in answer]

- 문자열을 정수로 바꾸기

이번에는 너무나 쉬운 문제였다...

그나저나 int()함수가 -까지 파씽하는줄은 몰랐다.

def solution(s):
    return int(s)

- 문자열 내 p와 y의 개수

def solution(s):
    return s.upper().count('P') == s.upper().count('Y')

- 정수 제곱근 판별

math.sqrt를 사용하여 판단한다.

def solution(n):
    import math
    sqareRoot = int(math.sqrt(n))
    if sqareRoot**2 == n:
        return (sqareRoot+1)**2
    else:
        return -1

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

def solution(n):
    answer = list(str(n))
    answer = sorted(answer, reverse=True)
    answer = ''.join(answer)
    return int(answer)

- 하샤드 수

def solution(x):
    divider = 0
    for i in str(x):
        divider += int(i)
    return x % divider == 0

- 두 정수 사이의 합

역시 다른 사람의 풀이를 보면 더 짧은 코드로 간결하게 짤 수 있다는 것을 알 수 있다. 원래 6줄이던 코드를 3줄이나 줄였다.

def solution(a, b):
    a, b = min(a, b), max(a, b)
    return sum(range(a, b+1))

- 콜라츠 추측

def solution(num):
    if num == 1:
        return 0
    count = 0
    while count < 500:
        if num % 2 == 0:
            num /= 2
        else:
            num = num*3 + 1
        count += 1
        if num == 1:
            break
    if count >= 500:
        return -1
    return count

- 서울에서 김서방 찾기

그저 순회해서 찾기만 하면 되는문제..

def solution(seoul):
    for i in range(len(seoul)):
        if seoul[i] == 'Kim':
            return '김서방은 {}에 있다'.format(i)
    return 0

- 나누어 떨어지는 숫자 배열

def solution(arr, divisor):
    answer = []
    for x in arr:
        if x % divisor == 0:
            answer.append(x)
    if len(answer) == 0:
        answer.append(-1)
    return sorted(answer)

- 음양 더하기

def solution(absolutes, signs):
    answer = 0
    for i in range(len(absolutes)):
        if signs[i] == True:
            answer += absolutes[i]
        else:
            answer -= absolutes[i]

    return answer

print(solution([4,7,12], [True,False,True]))

- 핸드폰 번호 가리기

def solution(phone_number):
    return '*' * (len(phone_number) - 4) + phone_number[-4:]

- 없는 숫자 더하기

def solution(numbers):
    answer = 0
    for x in range(10):
        if x not in numbers:
            answer += x
    return answer

print(solution([1,2,3,4,6,7,8,0]))

- 제일 작은 수 제거하기

def solution(arr):
    value = min(arr)
    arr.remove(value)
    if len(arr) == 0:
        arr.append(-1)
    return arr

- 가운데 글자 가져오기

def solution(s):
    if len(s) % 2 == 0:
        answer = s[len(s)//2 - 1:len(s)//2 + 1]
    else:
        answer = s[len(s)//2]
    return answer

- 수박수박수박수박수박수?

def solution(n):
    answer = '수박'
    answer *= n//2
    if n % 2 ==1:
        answer += '수'
    return answer

- 내적

def solution(a, b):
    answer = 0
    for i in range(len(a)):
        answer += a[i]*b[i]
    return answer

- 약수의 개수와 덧셈

효율성 테스트가 없는 쉬운 문제이다.

def solution(left, right):
    answer = 0
    for num in range(left, right+1):
        count = 1
        for i in range(1, int(num/2) + 1):
            if num % i == 0:
                count += 1
        print(num, count)
        if count % 2 == 0:
            answer += num
        else:
            answer -= num
    return answer

- 문자열 내림차순으로 배치하기

python 문자열은 .sort()메소드를 가지고 있지 않다. 그래서 sorted() 내장 함수를 이용해야 하는데, 결과가 리스트로 나온다. 이것을 다시 문자열로 만드려면 .join메소드를 사용해 문자열로 만들어 줄 수 있다.

def solution(s):
    answer = "".join(sorted(s, reverse=True))
    return answer

- 부족한 금액 계산하기

def solution(price, money, count):
    answer = money - price*count*(count+1)//2
    if answer > 0:
        answer = 0
    return abs(answer)

- 문자열 다루기 기본

python 에서 문자열을 잘 다루려면 기본적인regular expression을 사용할줄 알아야 한다.

'[0-9]'는 한 글자가 숫자라는 것이고, '[0-9]+'는 숫자가 1개 이상 이라는 것이다. '[0-9]'*는 숫자가 0개 이상이라는 것이다. 

'[0-9a-zA-z]'는 한글자가 숫자이거나 알파벳이라는 것이다. '[^0-9]'는 한 글자가 숫자가 아니라는 것이다.

def solution(s):
    import re
    if len(s) == 4 or len(s) == 6:
        if re.fullmatch('[0-9]+', s):
            return True
        else:
            return False
    else:
        return False

- 행렬의 덧셈

def solution(arr1, arr2):
    for y in range(len(arr1)):
        for x in range(len(arr1[y])):
            arr1[y][x] += arr2[y][x]
    return arr1

- 직사각형 별찍기

a, b = map(int, input().strip().split(' '))
for y in range(b):
    print('*'*a)

- 최대공약수와 최소공배수

def solution(n, m):
    small = min(n, m)
    big = max(n, m)
    answer = []
    #최대공약수
    for x in range(small, 0, -1):
        if small % x == 0  and big % x == 0:
            answer.append(x)
            break
    #최소공배수
    for x in range(big, small * big + 1):
        if x % big == 0 and x % small == 0:
            answer.append(x)
            break
    return answer

- 같은 숫자는 싫어

def solution(arr):
    current = arr[0]
    answer = [current]
    for x in arr:
        if current != x:
            answer.append(x)
        current = x
    return answer

- 3진법 뒤집기

10진법을 3진법으로 나누는 방법은 나눠서 몫은 저장해두고 나머지만 더하다가 몫이 3미만이 되었을 때 마지막으로 더하고 reverse하면 된다. 그러나 문제에서는 뒤집어져있는 버전을 원하므로 뒤집지 않아도 된다. 

def solution(n):
    answer = 0
    reversedTernaryNotation = ''
    remainder = 0
    while n >= 3:
        remainder = n % 3
        reversedTernaryNotation += str(remainder)
        n = n // 3
    reversedTernaryNotation += str(n)
    return int(reversedTernaryNotation, 3)

print(solution(45))

뒤집으려면 어떻게 하느냐? string[::-1]을 하면 뒤집어진다. https://docs.python.org/3/library/stdtypes.html#sequence-types-list-tuple-range 를 보면

s[i:j:k] slice of s from i to j with step k (3)(5)

이라고 되어있다. string[start, end, step]인데 step을 -1로 지정하면 맨끝에서 맨앞으로 탐색하여 반환하는것이다.

- 예산

그저 정렬하고 세주기만 하면 되는 문제이다.

def solution(d, budget):
    answer = 0
    d.sort()
    for x in d:
        if budget >= x:
            budget -= x
            answer += 1
        else:
            break
    return answer

- 이상한 문자 만들기

공백이 나오면 count를 0으로 초기화해 인덱스를 구현한다.

.upper()와 .lower()메소드를 사용해 대문자, 소문자로 만든다

def solution(s):
    answer = ''
    count = 0
    for x in range(len(s)):
        if s[x] == ' ':
            answer += ' '
            count = 0
        else:
            if count % 2 == 0:
                answer += s[x].upper()
            else:
                answer += s[x].lower()
            count += 1
    return answer

- 최소직사각형

가로 세로중 작은 값을 가로, 큰 값을 세로로 정렬한다.

def solution(sizes):
    for x in sizes:
        x.sort()
    print(sizes)
    widths = [x[0] for x in sizes]
    heights = [x[1] for x in sizes]
    answer = max(widths) * max(heights)
    return answer

- 시저 암호

ord()는 문자의 유니코드 정수를 반환하고, chr()는 정수를 문자로 반환한다.

65와 90사이, 97과 122사이로 대소문자를 구별하면 된다.

def solution(s, n):
    answer = ''
    for x in s:
        answer += caesar(x, n)
    return answer

def caesar(c, n):
    if 65 <= ord(c) <= 90:
        asciiValue = ord(c)+n
        if asciiValue > 90:
            asciiValue -= 26
        return chr(asciiValue)
    elif 97 <= ord(c) <= 122:
        asciiValue = ord(c)+n
        if asciiValue > 122:
            asciiValue -= 26
        return chr(asciiValue)
    elif c == ' ':
        return ' '

- 숫자 문자열과 영단어

해당 문제는 c언어나 java같은 언어로 했다면 더욱 복잡했겠지만 python str은 replace라는 메소드를 지원해서 쉽게 구현하였다.

def solution(s):
    # replace 메소드를 사용하여 모든 숫자문자열을 숫자로 바꾼다.
    s = s.replace("zero", "0")
    s = s.replace("one", "1")
    s = s.replace("two", "2")
    s = s.replace("three", "3")
    s = s.replace("four", "4")
    s = s.replace("five", "5")
    s = s.replace("six", "6")
    s = s.replace("seven", "7")
    s = s.replace("eight", "8")
    s = s.replace("nine", "9")
    answer = int(s)
    return answer

print(solution("one4seveneight"))

- 크기가 작은 부분문자열

function solution(t, p) {
    const pLength = p.length;
    let answer = 0;
    let num;
    for(let i=0; i<t.length-(pLength-1); i++) {
        num = Number(t.slice(i, i+pLength));
        if(num <= Number(p))
            answer++;
    }
    return answer;
}

- 삼총사

function solution(number) {
    let answer = 0;
    const len = number.length;
    for(let f=0; f<len-2; f++) {
        for(let s=f+1; s<len-1; s++) {
            for(let t=s+1; t<len; t++) {
                if((number[f]+number[s]+number[t]) === 0)
                    answer++;
            }
        }
    }
    return answer;
}