출처: https://bumcrush.tistory.com/182 [맑음때때로 겨울]
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/140107

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 실패 코드 (시간초과) - DFS 풀이

package Programmers;
import java.util.ArrayList;
import java.util.List;
public class 점찍기 {
static int[] pm = new int[2];
static int answer = 0;
public static void main(String[] args){
점찍기 T = new 점찍기();
int k = 1;
int d = 5; //원점과 거리
T.solution(k, d);
}
public long solution(int k, int d) {
List<Integer> tempArr = new ArrayList<>();
for (int i = 0; i <= d; i++) {
if(k * i > d) break;
tempArr.add(k * i);
}
int[] myArr = new int[tempArr.size()];
for (int i = 0; i < tempArr.size(); i++) {
myArr[i] = tempArr.get(i);
}
//myArr을 만든다.
dfs(0, myArr, d);
return answer;
}
public void dfs(int L, int[] myArr, int d){
if(L == 2){
if(calc(pm, d)){
answer++;
return;
}else{
return;
}
}
for (int i = 0; i < myArr.length; i++) {
pm[L] = myArr[i];
dfs(L+1, myArr, d);
}
}
public boolean calc(int[] pm, int d){
int x = pm[0];
int y = pm[1];
double a = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
if(a <= d) return true;
return false;
}
}

 

12/16 개 성공 케이스다 시간초과 남.     

  1. 가능한 좌표 케이스 배열로 만들어서 좌표를 pm에 다가 넣고 calc에다가 보낸다.

  2. calc 에서 거리가 맞는지 확인하고 true false 로 반환. 

 

   ======== 시간초과남 =============

 

 

 

2. 코드수정 

package Programmers;
public class 점찍기 {
public static void main(String[] args){
점찍기 T = new 점찍기();
int k = 2;
int d = 4; //원점과 거리
T.solution(k, d);
}
public long solution(int k, int d) {
long answer = 0;
for(int i = 0; i <= d; i += k)
{
long dd = (long) d * d;
long ii = (long) i * i;
int top = (int) Math.sqrt(dd - ii);
answer += (top / k) + 1;
}
return answer;
}
}

1. 원의방정식 a^2 + b^2 = c^2 활용해서 풀면된다

2. 원의방정식에 따라서 x좌표(i)와 거리값을 알면 y값(top)이 산출된다.

3. x좌표(i) 일때 나올수 있는 최대 정수 y 에다가 k배수만큼 나눠주면 찍을수 있는 좌표가 나온다. 

ex). i = 2 일때 원의방정식에따라서 top(y) = 3.xxxxx 이고 최대지점은 (2, 3.xxxxx) 이므로 y가 3.xxxx 밑에있는 2의 배수지점을 모두 찾아 주면 된다.

 

+1 은 0 포함 해야하니까

 

 

※ 제한조건 보니 DFS로는 안풀릴거라 예상은했지만 수학적사고방식으로 푸는 학습이 더 필요할것같다.

 

 

 

반응형

+ Recent posts