[TIL] 230616 (코딩테스트: 핸드폰 번호 가리기, 평균 구하기, 2016년)

CountryGirl·2023년 6월 17일
0

TIL

목록 보기
2/80

📌 핸드폰 번호 가리기

문제점 & 시도 & 해결

정말 많은 문제가 있었다...

이 문제는 번호가 있으면 뒤 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.BuilderString을 바꿔줄 수 있기 때문에 바로 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;

이렇게 하게 되면 intint 가 나눠져서 int값이 double 로 변해 628.0 이렇게 나오게 된다.

하지만 sumint 가 아닌 double 로 선언한다면 바로 소수부분을 해결할 수 있었다 !

double sum = 0;

왜 여지껏 몰랐을까.....
바보같다...
그래서 평균을 구할 때 소수부분을 따로 구현했었다.....


📌 2016년

문제점 & 시도 & 해결

이 문제는 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 에러가 발생한다.

profile
💻🌾시골소녀의 엉망징창 개발 성장일지🌾💻 (2023.05.23 ~)

0개의 댓글