-
[코딩테스트] 프로그래머스 - 우박수열 정적분(Java, Level2)코딩테스트/프로그래머스 2022. 11. 10. 00:02728x90
안녕하세요.
오랜만에 다시 인사드리네요. 잠시 이래저래 준비하다보니 다시 글을 올립니다.
이번에 프로그래머스가 문제가 새로 나온건지 모르겠지만...
문제부터 만나보시죠~
https://school.programmers.co.kr/learn/courses/30/lessons/134239
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제에서는 정적분이었지만... 이과였음에도 수학머리가 없는지라... 그냥범위별로 잘라서 구했습니다.
이런식으로 네모의 넓이+삼각형의 넓이를 구했습니다.
은근히 오래걸렸는데요... 자바라는 언어에 익숙하지 않아서 생긴 일이기도 합니다.
일단 기록하자면
1) 문제에서 주어진 range는 좌표기준이 아닌 넓이 기준이다.
2) 소숫점을 계산하려면 double을 사용해야한다.
앞의 내용을 깨우치지 못해 창피하게도 이문제를 두시간이나 잡고있었네요...
코드입니다.
import java.util.*; class Solution { public double[] solution(int k, int[][] ranges) { double[] answer = new double[ranges.length]; //List<Double> answer=new ArrayList<>(); List<Double> area=new ArrayList<>(); int prevalue=0; prevalue=k; while(k>1) { //짝수일 경우 if(k%2==0) k=k/2; //홀수일 경우 else k=k*3+1; area.add(Math.min(prevalue,k)+Math.abs(prevalue-k)/(double)2); prevalue=k; } System.out.println(area); for(int i=0;i<ranges.length;i++) { if(ranges[i][0]==area.size()+ranges[i][1]) answer[i]=0.0; else if(ranges[i][0]>area.size()+ranges[i][1]) answer[i]=-1.0; else { double result=0; for(int j=ranges[i][0];j<area.size()+ranges[i][1];j++) result=result+area.get(j); answer[i]=result; } } return answer; } }
로직은
1. 기본값을 넓이를 구하기위해 사용할 prevalue값에 저장
2. k값이 1이 나올때까지 반복문을 돌리고
3. k가 양수, 음수경우에따라 k값을 다시 구하기
4. 구한 k값과 prevalue값을 이용해 범위의 넓이구해서 are List에 추가하기
5. k가1이나와 종료됐다면 ranges반복문을 통해 필요한 범위의 area만 뽑기
6. 문제에 나온것처럼 시작점과 종료점이 같으면 0.0, 종료점이 시작점보다 앞이면 -1.0, 나머지 경우는 result를 통해 합쳐줍니다.
7. 해당값을 answer array에 추가하고 리턴합니다.
이상입니다.
요즘 날씨가 매섭게 추워집니다. 다들 감기조심하시기 바랍니다. :D
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[코딩테스트] 프로그래머스 - 진료과별 총 예약 횟수 출력하기(MySQL, Level2) (0) 2022.11.14 [코딩테스트] 프로그래머스 - 3월에 태어난 여성 회원 목록 출력하기(MySQL, Level2) (0) 2022.11.13 [코딩테스트] 프로그래머스 - 야간 전술보행(Java, Level2) (0) 2022.11.11 [코딩테스트] 프로그래머스 - 게임 맵 최단거리(Java, Level2) (dfs, 실패) (0) 2022.10.24 [코딩테스트] 프로그래머스 - 연속 부분 수열 합의 개수(Java, Level2) (0) 2022.10.21