본문 바로가기

프로그래머스

점찍기

반응형

내코드

def solution(k, d):
    answer = 0
    cnt_b=0
    cnt_s=0
    cnt=1
    d_=(d+1)**2

    for i in range(0,d_):
        cnt_s+=1
        if cnt_s==(d+1):
            cnt_b+=1
            cnt_s=0

        b=cnt_b*k
        s=cnt_s*k 
        if s**2+b**2>d**2:
            continue
        cnt+=1
    
        
    return cnt

위코드의 원리는 값을 차례대로 올려주는 방식을 사용한다.그리고 일정량이상의 값이 되면 B값을 올리고 S값을 0으로 초기화를 한다.

이런방식으로는 이중반복문을 피했으나 시간초과가 걸렸다.그래서 다른사람의 코드를 보았다

 

def solution(k, d):
    answer = 0
    
    for x in range(0,d+1,k) :
        max_y = int( (d**2 - x**2)**0.5 )
        answer += (max_y // k) +1
    
    return answer

다른점은 두가지이다.

첫번째로는 range에 K값을 넣어서 반복횟수를 /K만큼 줄어든다.

어차피 나는 곱하는 형태였기에 이런방식을 통해도 값은 똑같이 나온다.

대신 시간복잡도를 조금이라도 줄일수 있다.

두번째는 피타고라스를 사용했다는 점이다.

X값정해져있을 경우 Y값이 나올수있는 경우의 수를 전부 구하면된다.

그래서 ( y² = r² - x²)공식을 이용한다.

그렇게 Y값을 구한뒤 숫자에서 k만큼 나눈후 +1한것이 Y값이 나올수있는 모든 경우의 수이다.

예를들어 값이 x가 2고 d가 4 K는 2이라고 가정하자

 

그러면 max_y는 2이다.피타고라스를 이용하면 쉽게 구할수 있다.

이렇게 되면 2가 나타날수있는 수중 가장 큰 수이다.그러면 K는 2이기때문에 나올수있는 수는 0과 2뿐이다.

2/k은 1이다. 그리고 0을 생각해서 +1을 하면 결과가 2가 나올것이다.

 

 

 

반응형

'프로그래머스' 카테고리의 다른 글

해시문제 완주하지 못한 선수  (0) 2024.02.23
최빈값 구하기  (0) 2024.02.23
특수문자 풀기  (0) 2024.02.22
대소문자 변환 코드  (0) 2024.02.22
나만의 문자열 분해방법  (0) 2024.02.22