정말 많은 문제가 있었다...
이 문제는 번호가 있으면 뒤 4자리만 나오고 나머지 앞에 있는 수는 *로 바꿔서 출력을 해야한다.
ex ) 01075677974
➡️ *******7974
이것도 그냥 보자마자 replce()
사용해야겠다고 생각했다..
하지만 아주 옳지 않은 생각이었다.
String answer = ""; // phone_number = "01075677974"
for (int i = 0; i < phone_number.length() - 4; i++) {
answer = phone_number.replace(phone_number.charAt(i), '*');
}
처음에 replace()
를 이용해서 코드를 작성해보았다.
하지만 결과값으로
010*56**9*4
이 출력됐다.
코드를 다시 살펴보니 phone_number
의 마지막에서 5번째 자리의 값이 만약 7
이라면 phone_number
에 있는 모두 7
을 *
로 바꿨다....
아차... replace()
는 모든 값을 바꾸는구나...
그래서 다음으로 찾은 방법은 되게 1차원적인 방법이었다.
뒤에 4개와 앞부분으로 잘라서 앞부분의 길이만큼 answer
에 *
을 더해주고 그냥 뒤 4자리를 더해 출력하는 방법이었다...
0107567
, 7974
이렇게 나누고 0107567.length()
만큼 *
를 출력하도록...
하지만 너무 1차원적인 방법 같아서 다른 방법을 또 생각해보았다.
자바의 배열이나 문자열은 마음대로 바꿀 수가 없다. 불변?
그래서 자유롭게 가변할 수 있는 String.Builder
를 사용하였다.
String.Builder
는 String
을 바꿔줄 수 있기 때문에 바로 phone_number
를 *
로 바꿀 수 있었다.
StringBuilder sb = new StringBuilder(phone_number);
for (int i = 0; i < sb.length() - 4; i++) sb.setCharAt(i, '*');
이렇게 StringBuilder
내에 있는 setCharAt()
을 사용해 문제를 해결하였다.
정수 배열에 있는 값을 더해서 실수형으로 평균을 구하는 것이다.
나는 지금까지 /
연산자는 당연히 정수형으로 몫만 나오는 줄 알았다.
그래서 나머지를 어떻게 소수부분으로 표현해야하지? 엄청 고민을 했다.
하지만 생각보다 쉽게 해결할 수 있었다...
int[] intArray = {12, 405, 156, 87, 11, 90, 475, 3423, 1000};
int sum = 0;
double avg = 0;
(...)
sum += intArray[i];
avg = sum / intArray.length;
이렇게 하게 되면 int
와 int
가 나눠져서 int
값이 double
로 변해 628.0
이렇게 나오게 된다.
하지만 sum
을 int
가 아닌 double
로 선언한다면 바로 소수부분을 해결할 수 있었다 !
double sum = 0;
왜 여지껏 몰랐을까.....
바보같다...
그래서 평균을 구할 때 소수부분을 따로 구현했었다.....
이 문제는 2016년에 a 월 b 일은 무슨 요일인지 출력하는 것이었다.
2016년은 윤년이라 2월이 29일까지 있었고 달마다 마지막 일이 언제인지 먼저 나누었다.
1월 : 31
2월 : 29
3월 : 31
4월 : 30
5월 : 31
6월 : 30
7월 : 31
8월 : 31
9월 : 30
10월 : 31
11월 : 30
12월 : 31
월요일부터 일요일까지 계속 로테이션이 되어야하고, 달이 바뀌어도 요일은 그대로 이어서 돌아가도록 해야했다.
머릿속으로 다 생각이 되는 어떻게 접근을 해야할 지 몰랐다.
일단 2016년 1월 1일은 금요일이므로 요일 배열에 0번째는 금요일로 하였다.
String[] week = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"};
로테이션을 돌아야한다는 것이 머릿속에 박혀 계속 배열을 생각했다.
하지만 달이 바뀌면 요일은 유지되어야하는 것을 구현하지 못해 배열로 해결하는 것은 하지못했다.
다음으로 생각난 것은 1월 1일부터 시작해 a월 b일까지에 총 일수를 더해 7로 나누는 것이었다.
달마다 마지막 일이 다르기 때문에 달을 조건문으로 나누고 일수를 더해주었다.
for (int i = 1; i < a; i++) {
if (i == 2) {
days = 29;
} else if (i == 4 || i == 6 || i == 9 || i == 11) {
days = 30;
} else days = 31;
totalDays += days;
}
totalDays += b;
총 날짜수가 잘 더해졌고, 요일을 출력하는 것만 남았는데 여기서 또 문제가 생겼다.
answer = week[totalDays % 7 - 1];
이렇게 하게 되는 경우 만약 목요일일 경우 indexError가 났다....
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at Year2016_01.main(Year2016_01.java:21)
totalDays = 343
라면 totalDays % 7 : 343 % 7 == 0
인덱스가 0
인데 0
에서 1
을 뺄 수 는 없다...
그래서 ArrayIndexOutOfBoundsException
오류가 났다..
그래서 목요일만 야매로...
따로 지정해주기로했다
answer = (totalDays % 7 == 0) ? week[6] : week[totalDays % 7 - 1];
이렇게 이 문제도 잘 해결할 수 있었다..
가변으로 문자열을 바꾸고 싶을 땐 StringBuilder
를 사용할 수 있다.
평균을 구할 때 double
로 선언하면 소수점으로 나타낼 수 있다.
index = -1
은 맨 뒤 element
를 가리키지 않고 ArrayIndexOutOfBoundsException
에러가 발생한다.