출처- 프로그래머스
점점 속도가 붙지만 ArrayList, Hash 관련 자료구조 개념이 나오면서 정말 어려워졌다
디테일한 부분도 놓치지 말자
1. x만큼 간격이 있는 n개의 숫자
문제 : 함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.
조건 :
- x는 -10000000 이상, 10000000 이하인 정수입니다.
- n은 1000 이하인 자연수입니다.
해결 :
class Solution {
public long[] solution(int x, int n) {
long[] answer = new long[n];
for(int i = 0; i < n; i++){
answer[i] = (long)x * (i+1);
}
return answer;
}
}
해석 :
1. int 값을 받아와서 long으로 형변환 해주어야한다.
2. 먼저 long 타입의 자연수 n의 배열을 만들어준다.
3. 반복문을 통해 answer의 인덱스에 정수(long 타입) 을 대입해주기전에 (i + 1)을 꼭 해주어야한다.
4. 쉽게 보면 n의 매개변수를 배열을 이용한 i의 인덱스 요소로 치환하여 x를 대입하면 x의 간격만큼 n의 배열을 만들어 주는 개념이다. 이런 알고리즘을 잘 기억해두자.
2. 부족한 금액 계산하기
문제 :
새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.
조건 :
- 놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
- 처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
- 놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수
해결 :
class Solution {
public long solution(int price, int money, int count) {
long answer = 0;
long totalPrice = 0;
// 놀이기구 타려면 총 비용을 계산해야함.
for(int i = 1; i <= count; i++){
totalPrice += price * i;
}
answer = (totalPrice > money) ? totalPrice - money : 0;
return answer;
}
}
해석 :
1. 매개변수 price, money, count의 값을 받는 method를 만들고 내가 현재가지고 있는 전체 금액인 totalPrice 변수를 선언한다.
2. 그리고 count 만큼 총 비용을 계산해줘야하는데 price * 횟수(i)의 값을 totalPrice에 대입한다.
난 여기서 for문안에 있는 기준을 파악하는데 오래걸렸다. count까지 포함하여 비용을 계산해야하기때문에 i<=count로 조건식을 만들고 한번도 타지않는 경우는 이 문제의 의도와 다르기 때문에 i=1로 초기값을 설정해줘야한다는 것을 너무 늦게 이해했다.. 똥멍청함
3. 삼항 연산자를 이용하여 totalPrice > money인 경우 얼마가 모자란지 반환해주고 금액이 부족하지 않은 경우는 0을 return하면 된다.
처음에 totalPrice 값을 int 타입으로 선언했더니 23번의 테스트중에 5번의 테스트는 통과하지 못한다..그 이유는 price와 i는 서로 int라서 저둘이곱할때 int범위를 넘어가기 때문이다.
3. 2016년 (월, 일 입력하면 요일 반환하기)
문제 : 2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT
입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요.
조건:
- 2016년은 윤년입니다.
- 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다)
해결 :
import java.time.*;
class Solution
{
public String solution(int a, int b) {
return LocalDate.of(2016, a, b).getDayOfWeek().toString().substring(0,3);
}
}
해석 :
1. java.time 패키지를 이용하는 방법이 있다. 정말 한줄에 끝나는 놀라운 코드인 것 같다.
2. java.time 패키지중 핵심 클래스인 날짜를 구하는 LocalDate를 이용하여 LocalDate가 제공하는 of, getDayOfWeek 메서드를 이용하여 요일을 구한다.
3. 이건 내가 설명하는것보다 https://ryan-han.com/post/java/java-calendar-date/(출처 - Integerous Devlog) 가보면 정말 자세히 설명이 되어있다. 꼭 한 번 읽어보는 것을 추천함.
4. 나누어 떨어지는 숫자배열
문제 : array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
조건:
- arr은 자연수를 담은 배열입니다.
- 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
- divisor는 자연수입니다.
- array는 길이 1 이상인 배열입니다.
해결 :
import java.util.*;
class Solution {
public int[] solution(int[] arr, int divisor) {
int count = 0;
int number = 0;
for(int i = 0; i < arr.length; i++){
if(arr[i] % divisor == 0){
count++;
}
}
if(count == 0){
int[] answer = {-1};
return answer;
}
int[] answer = new int[count];
for(int i = 0; i < arr.length; i++){
if(arr[i] % divisor == 0){
answer[number] = arr[i];
number++;
}
}
Arrays.sort(answer);
return answer;
}
}
해설 :
1. 우선 배열의 요소중에 divisor의 값으로 나누어 떨어지는 수를 count해준다.
2. 만약에 나누어떨어지는 수가 없다면 answer[ ] = { -1}값을 반환해주는 if문을 만든다.
3. 나누어 떨어지는 수를 count해주었다면 count된 수만큼의 길이를 반환해주는 answer[] 배열을 초기화해준다.
4. 1번과 같은 방법으로 for문을 돌려주지만 배열의 길이가 다시 설정되었기때문에 answer[number] 인덱스에 새로운 arr[i]의 값을 대입한다.
5. Arrays 클래스를 이용하여 sort해주고 답을 반환한다.
오후에 또 정리하자
'Algorithm > 프로그래머스 LV 1 (Day 3)' 카테고리의 다른 글
[JAVA] 알고리즘 입문 LV.1(1/1) (0) | 2022.07.17 |
---|