안녕하세요! delay100입니다.
오늘은 일요일..이고.. 시간은 오후 9시..네요... 늦은 TIL 시작합니다..!!
미들러 문제.
크기가 작은 부분 (https://school.programmers.co.kr/learn/courses/30/lessons/147355)
1. 실패 & 런타임에러 코드
가장 먼저 떠올라서 풀었던 방식입니다. java의 String 에서 substring을 이용한 방식인데,
length를 구하는 if문이 잘못되었고 substring과 parseInt로 계산 시 런타임에러가 발생합니다.
if문을 테스트케이스만 보고 홀, 짝으로 잘못 생각하여 계산했습니다. 이를 바꾼 코드는 3번 정답 코드에 있습니다.
class Solution {
public int solution(String t, String p) {
int answer = 0;
int length = 0;
// 잘못된 if문
if((t.length()-p.length()) % 2 == 1) {
length = t.length() - p.length() + 1;
} else {
length = t.length() - p.length();
}
for(int i=0; i<length; i++) {
int a = Integer.parseInt(t.substring(i, i+p.length()));
if(a <= Integer.parseInt(p)) {
answer++;
}
}
return answer;
}
}
2. 실패 코드
아예 substring을 이용하지말고 다르게 접근해보려고 고민을 하다가 아래와 같은 테스트 케이스를 떠올렸습니다.
t = 16123, p = 152 / 결과 = 1
이번에는 string들을 char 배열로 바꾸고, char 배열을 int 배열로 바꾼 후 각 자리를 비교해주었습니다.
161 > 152
t[1] = 6에 도달했을 때 6 > 5(p[1])이므로 아무것도 처리하지 않고 바로 return;
어차피 뒤에 올 수가 커봤자 앞자리수가 큰 것을 넘지 못하기 때문입니다.
612 > 152
위와 동일한 이유로 return;
123 < 152
t[1] = 2 < p[1] = 5 이므로 정답 값 +1을 해줍니다.
그리고 테스트케이스로 추가는 하지 않았지만,
152 = 152 같이 동일한 값이 있는 예제를 처리하기 위해서 isTrue 변수를 이용했습니다.
isTrue 개수가 p의 길이와 같으면 정답 값 +1을 해주도록 했습니다.
import java.io.*;
import java.util.*;
class Solution {
public int solution(String t, String p) {
int answer = 0;
int length = 0;
char[] c = t.toCharArray();
char[] c2 = p.toCharArray();
int[] list = new int[t.length()];
int[] list2 = new int[p.length()];
// t리스트를 int배열로 변경
for(int i=0; i<t.length(); i++) {
list[i] = c[i] - '0';
// System.out.println(list[i]);
}
// p리스트를 int배열로 변경
for(int i=0; i<p.length(); i++) {
list2[i] = c2[i] - '0';
// System.out.println(list2[i]);
}
// 반복할 수 구하기
if((t.length()-p.length()) % 2 == 1) {
length = t.length() - p.length() + 1;
} else {
length = t.length() - p.length();
}
int isTrue = 0;
for(int i=0; i<length; i++) {
for(int j=0; j<p.length(); j++) {
if (list[i+j] > list2[j]) break;
else if(list[i+j] == list2[j]) {
isTrue++;
} else {
answer++;
break;
}
}
if(isTrue == p.length()) answer++;
isTrue = 0;
}
return answer;
}
}
1번보다 확실히 나아졌지만 에러가 발생하고 있습니다.
3. 성공 코드
실패코드 2에서 t를 반복할 수를 구하는 곳이 문제가 있습니다.
// ex
1. t = 10203, p = 15인 경우 1020까지 반복해야 함(p의 길이(2) - 1)
2. t = 500220839878, p = 7인 경우 500220839878까지(전부) 반복해야 함(p의 길이(1) - 1)
위의 예시처럼 p의 반복할 길이(length)는 t의 길이 - (p의 길이 - 1)을 해주어야합니다.
나머지 코드에 대한 설명은 주석으로 작성해두었습니다.
import java.io.*;
import java.util.*;
class Solution {
public int solution(String t, String p) {
int answer = 0;
char[] c = t.toCharArray();
char[] c2 = p.toCharArray();
int[] list = new int[t.length()];
int[] list2 = new int[p.length()];
// t리스트를 int배열로 변경
for(int i=0; i<t.length(); i++) {
list[i] = c[i] - '0';
}
// p리스트를 int배열로 변경
for(int i=0; i<p.length(); i++) {
list2[i] = c2[i] - '0';
}
// t를 반복할 수 구하기
// t = 10203, p = 15인 경우 1020까지 반복해야 함(p의 길이(2) - 1)
// t = 500220839878, p = 7인 경우 500220839878까지(전부) 반복해야 함(p의 길이(1) - 1)
// t의 길이 - (p의 길이 - 1)
int length = t.length() - (p.length() - 1);
int isTrue = 0; // t의 부분 문자열이 p랑 같은 값인 경우를 파악하기 위한 변수
for(int i=0; i<length; i++) {
for(int j=0; j<p.length(); j++) {
if (list[i+j] > list2[j]) break; // 각 숫자끼리 비교했을 때, t에 큰 숫자가 있으면 무조건 p보다 큰 숫자이므로 t의 다음 숫자로 넘어감
else if(list[i+j] == list2[j]) { // 각 숫자가 같으면, p의 자릿수 만큼 같은지(동일한 숫자인지 판별하기 위함) 확인하기 위해 isTrue 값을 +1 해줌
isTrue++;
} else {
answer++; // t의 현재 숫자가 p의 현재 숫자보다 작으면 다음 자리를 볼 필요 없이 무조건 t가 작은 숫자이므로 정답 값에 +1을 해줌
break;
}
}
if(isTrue == p.length()) answer++; // p의 문자열 길이와 isTrue값이 같은지 확인하고 동일한 숫자이면 정답 값에 +1을 해줌
isTrue = 0;
}
return answer;
}
}
+ 비기너 문제
콜라츠 추측 (https://school.programmers.co.kr/learn/courses/30/lessons/12943)
+ 챌린저 문제
피로도 (https://school.programmers.co.kr/learn/courses/30/lessons/87946)
봐주셔서 감사합니다!
'항해99 > 99club1기TIL' 카테고리의 다른 글
[99club/TIL] 2주차 - 화요일 TIL(Today I Learned) (0) | 2024.04.02 |
---|---|
[99club/TIL] 2주차 - 월요일 TIL(Today I Learned) (0) | 2024.04.01 |
[99club/TIL] 1주차 - 토요일 TIL(Today I Learned) (0) | 2024.03.30 |
[99club/TIL] 1주차 - 금요일 TIL(Today I Learned) (0) | 2024.03.30 |
[99club/TIL] 1주차 - 목요일 TIL(Today I Learned) (0) | 2024.03.28 |