항해99 7기 8일차 TIL[JAVA 프로그래머스 알고리즘]
2022년 5월 16일 항해 8일차.
오늘도 어제와 같이 자바문법 공부, 조원들과 알고리즘을 풀어보는 시간을 가졌다.
또! 오늘은 CS 스터디가 있는 날이었다...
내일부터 '1일 1로그 100일 완성 IT지식'을 한챕터씩 읽고 조원들 앞에서 발표해보는 시간을 갖게되었다.
과제가 서서히 많아지고있다;;;
9. 핸드폰 번호 가리기
문제 설명 :
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.
제한 조건 :
- s는 길이 4 이상, 20이하인 문자열입니다.
입출력 예 :
phone_number | return |
"01033334444" | "*******4444" |
"027778888" | "*****8888" |
public class number9 {
String solution(String phone_number) {
String answer = "";
//.split을 사용해서 phone_number를 하나하나씩 잘라서 a라는 문자배열에 저장.
String[] a = phone_number.split("");
for(int i= 0; i<a.length; i++){
if(i < (a.length-4)) {
answer += "*";
} else {
answer += a[i];
}
}
return answer;
}
public static void main(String[] args) {
number9 n = new number9();
String solution = n.solution("01012341234");
System.out.println("번호 = " + solution);
}
}
//1. 핸드폰 번호 앞자리를 가리기 위해 answer 변수의 타입을 String으로 해줌.
//2. split을 사용하여 phone_number을 하나씩 잘라서 a라는 문자열 배열에 저장
//3. 총 answer의 길이가 a.length와 동일하기에 for문을 사용
// 1) i < a.length-4 일 때
// - 맨 뒷 자리 4자리수만 빼고 가리면 되기에 "*"을 answer에 추가
// 2) i < a.length-4 가 아닐 때
// - 맨 뒷 자리 4자리 수는 가리면 안 되기에 a[i]에 해당하는 수를 answer에 추가
//4. answer를 return을 사용하여 반환
10. x만큼 간격이 있는
문제 설명 :
함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.
제한 조건 :
- x는 -10000000 이상, 10000000 이하인 정수입니다.
- n은 1000 이하인 자연수입니다.
입출력 예 :
x | n | answer |
2 | 5 | [2, 4, 6, 8, 10] |
4 | 3 | [4, 8, 12] |
-4 | 2 | [-4, -8] |
import java.util.Arrays;
public class number11 {
long[] solution(int x, int n) {
long[] answer = new long[n];
long a = x;
for(int i = 1; i <= n; i++){
answer[i-1] = a * i;
}
return answer;
}
public static void main(String[] args) {
number11 n = new number11();
long[] solution = n.solution(2, 5);
System.out.println(Arrays.toString(solution));
}
}
// 1. 반환할 answer 변수를 long[] 타입, 크기 n으로 선언
// 2. long 타입 a 변수에 x를 넣어 선언
// - long 타입 연산을 해서 answer에 넣어야하기 때문
// 3. answer[i-1] = a * i라는 공식을 for 문을 i가 n일 때까지 반복
// - a * i 는 길이만큼 떨어져 있는 값이 됨
// 4. return을 사용해 answer을 반환
11. 부족한 금액 계산하기
문제 설명:
새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 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는 자연수
public class number12 {
public long solution(int price, long money, int count) {
long result = 0;
long totalPrice = 0;
// 1. 놀이기구를 타기위한 총 비용을 계산
for(int i=1; i<=count; i++) {
totalPrice += price * i;
}
// 2. 가진 돈과 비교 하여 return 값 지정
result = (totalPrice > money) ? totalPrice-money : 0;
return result;
}
public static void main(String[] args) {
number12 n = new number12();
long solution = n.solution(3, 50, 4);
System.out.println(solution);
}
}
// 1. long타입 result 값과 totalprice 값을 0으로 초기화한다.
// 2. 놀이기구를 타기위한 총 비용을 계산하기 위해 count를 for문으로 반복해주고 반복 횟수마다 price를 곱해주면서 totalprice 값을 계산해준다.
// 3. money 변수와 totalprice 값을 비교해서 result값을 리턴해준다.
12. 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일같은 날짜는 주어지지 않습니다)
입출력 예 :
a | b | result |
5 | 24 | "TUE" |
import java.util.Calendar;
public class number13 {
String solution(int a, int b) {
Calendar c = Calendar.getInstance();
c.set(2016, a - 1, b);
String[] answer = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
int weekday = c.get(Calendar.DAY_OF_WEEK);
return answer[weekday-1];
}
public static void main(String[] args) {
number13 n = new number13();
String solution = n.solution(5, 15);
System.out.println(solution);
}
}
//1. Java 클래스 Calendar를 import해준 뒤 Calendar 객체를 생성한다.
// -Calendar.getInstance()를 통해 import 가능
//2. 달력은 입력 받는 것보다 +1을 하여 들어가기 때문에 입력할 때 a-1를 사용하여 set을 이용해 설정한다.
//3. answer 배열에 요일의 이름으로 초기화한다.
//4. weekday에 Calendar 클래스에 있는 요일을 받아오는 DAY_OF_WEEK을 사용하여 가져온다.
//5. DAY_OF_WEEK은 1, 2, 3, 4, 5, 6, 7 이런 식으로 가져오기 때문에 answer 배열에 사용했고 -1을 통해 본래의 요일로 맞춰주었다.(위에도 서술했듯 Calendar는 +1하여 들어감)
//6. return을 사용해서 결과값을 반환한다.
13. 나누어 떨어지는 숫자 배열
문제 설명 :
array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.
제한사항 :
- arr은 자연수를 담은 배열입니다.
- 정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
- divisor는 자연수입니다.
- array는 길이 1 이상인 배열입니다.
입출력 예 :
arr | divisor | return |
[5, 9, 7, 10] | 5 | [5, 10] |
[2, 36, 1, 3] | 1 | [1, 2, 3, 36] |
[3,2,6] | 10 | [-1] |
입출력 예 설명 :
입출력 예#1
arr의 원소 중 5로 나누어 떨어지는 원소는 5와 10입니다. 따라서 [5, 10]을 리턴합니다.
입출력 예#2
arr의 모든 원소는 1으로 나누어 떨어집니다. 원소를 오름차순으로 정렬해 [1, 2, 3, 36]을 리턴합니다.
입출력 예#3
3, 2, 6은 10으로 나누어 떨어지지 않습니다. 나누어 떨어지는 원소가 없으므로 [-1]을 리턴합니다.
import java.util.*;
public class number14 {
int[] solution(int[] arr, int divisor) {
int[] answer = {};
ArrayList<Integer> a1 = new ArrayList<Integer>();
for(int i = 0; i <arr.length; i++){
if(arr[i]%divisor == 0){
a1.add(arr[i]);
}
}
if(a1.isEmpty()){
a1.add(-1);
}
answer = new int[a1.size()];
for(int i = 0; i<a1.size() ; i++){
answer[i] = a1.get(i);
}
Arrays.sort(answer);
return answer;
}
public static void main(String[] args) {
number14 n = new number14();
int[] solution = n.solution(new int[]{3,2,9},4);
System.out.println(Arrays.toString(solution));
}
}
// 1. int[] 타입으로 반환할 answer 변수를 초기화하여 선언했다.
// 2. ArrayList인 a1을 Integer 타입으로 선언했다,
// 3. for 문을 사용하여 arr 배열에 있는 원소를 divisor로 나누었을 때 나머지가 0인 원소만 add를 사용하여 a1에 추가했다
// 4. a1이 비어있을 경우 a1에 add를 이용하여 -1을 추가했다.
// 5. answer의 크기를 a1의 size 만큼으로 설정했다.
// 6. for문을 사용하여 a1에 있는 원소를 get으로 꺼내서 answer에 저장했다
// 7. answer을 Arrays.sort를 이용해 정렬했다.
// 8. return을 사용하여 answer을 반환했다.
걱정이 이만저만이 아니다.
서서히 단계가 올라갈때마다 알고리즘이 어려워지고,
자바 객체지향 과제는 진척이 없으며.
cs 스터디까지...
내일 cs 스터디 발표 준비도 해야한다.
1주일새 엄청 할게 많아졌다. 얼른 자바문법에 익숙해지고 점점더 쌓여가는 스케쥴에 적응할 수 있었으면 좋겠다.