TIL

231025 프로그래머스 문제풀기

유초23 2023. 10. 25. 23:00
728x90

빨리 끝내고 싶닥 !

화이탱 !


* 분수의 덧셈 문제에서는

def solution(numer1,denom1,numer2,denom2):
    numer1/denom1 + numer2/denom2 = numer/denom
    for i in range(2,1000):
        if numer % i == 0 and denom % i == 0:
            numer = numer//i
            denom = denom//i
    return [numer,denom]

 

이런식으로 풀어보려고 시도는 했지만 처참히 실패 ^^ ...

 

최대공약수인 gcd함수를 사용해야 하는 문제여똬 ,,

 

math를 import하는 방법이 있고 그렇지 않은 방법이 있다 !

 

첫번째 방법을 사용하면

 

import math

def solution(numer1,denom1,numer2,denom2):
    numer = denom1*numer2 + denom2*numer1
    denom = denom1*denom2
    gcd = math.gcd(numer,denom)
    return [numer//gcd , denom//gcd]

 

이렇게 문제를 해결할 수 있고,

두번째 방법으로는

 

def gcd(a,b):
    while b > 0:
        a,b = b,a%b
    return a

def solution(numer1,denom1,numer2,denom2):
    numer = denom1*numer2 + denom2*numer1
    denom = denom1*denom2
    g = gcd(denom,numer)
    return [numer//g , denom//g]

 

이렇게 문제를 해결할 수 있다 !


* 연속된 수의 합 문제는

 

def solution(num,total):
    result = []
    if num % 2:
        for i in range(num):
            p = total//num + (num-1)//2
            p -= i
            result.append(p)
    else:
        for i in range(num):
            p = total//num + num//2
            p -= i
            result.append(p)
    return sorted(result)

 

이렇게 문제를 해결하였는데,

아주 간결한 코드가 있어 가져와봤다 !

 

def solution(num, total):
    return [(total - (num * (num - 1) // 2)) // num + i for i in range(num)]

 

두줄로 코드를 완성하다니 ..

대 다 내 ...

 

 

그 외에도 이 문제는 각자 생각한 대로 다양한 답들이 있는 것 같다 !


* 주사위 게임 3 문제는

 

안풀려서 구글링을 했는데 ,,

음 ...

몇개의 깔끔한 코드들을 봤는데 이해가 안가는 부분들이 있어서 이건 따로 물어보거나 해야될 듯 하다 !

 


* 안전지대 문제는

 

구글링을 통해 이해하고 문제를 해결하였돠 ..

 

def solution(board):
    n = len(board)

    for x,row in enumerate(board):
        for y,area in enumerate(row):

            if area == 1:
                for dx in [-1,0,1]:
                    for dy in [-1,0,1]:
                        nx = x + dx
                        ny = y + dy

                        if 0 <= nx < n and 0 <= ny < n and board[nx][ny] != 1:
                            board[nx][ny] = "X"
    safe_count = sum([area.count(0) for area in board])
    return safe_count

 

이 문제 역시 enumerate함수를 사용해야 하는 문제여따 ,,

enumerate함수 .... 너 굉장한 아이구나 ..

 

점점 갈수록 풀이도 어려워지는 것 같ㄷㅏ ...... 됴륵 ....

 

더 깔끔한 풀이로는

 

def solution(board):
    n = len(board)
    danger = set()
    for i, row in enumerate(board):
        for j, x in enumerate(row):
            if not x:
                continue
            danger.update((i+di, j+dj) for di in [-1,0,1] for dj in [-1, 0, 1])
    return n*n - sum(0 <= i < n and 0 <= j < n for i, j in danger)

 

이런 풀이도 있었는데,

마지막에 sum을 빼줄때 지뢰가 있는 1 부분도 같이 빠지는건지 ?-? 한 상태이긴 하다 ,,

물어봐야쥐 ,,,


오늘은 여기까지 !

화이팅하자고 ~!~~

728x90