오늘 학습한 내용
- Java : Collections Framework 내용 복습
- 프로그래머스 문제풀이
문제 상황
프로그래머스 레벨 0 문제 중에서 1주일 정도 고민을 해도 풀리지 않던 문제가 있었다.
바로 '배열 만들기 2'이다..
문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/181921
시도한 내용
내가 처음 풀이로 작성했던 코드는 다음 링크에서 확인할 수 있다.
https://bluescoding.tistory.com/47
2023-05-17 TIL (프로그래머스 문제풀이)
오늘 학습한 내용 Java : 반복문과 배열 내용 복습, 프로그래머스 문제 풀이 내용 프로그래머스 문제 (해결되지 않은 문제) 문제는 배열 만들기 2이다. 코드를 실행하면 테스트 코드들은 문제 없이
bluescoding.tistory.com
인터넷에서 열심히 찾아본 결과 List에서 Array로 변경되는 과정이 시간이 오래걸린다는 이야기가 많았다.
내가 작성한 코드가 아무래도 List에서 Array로 변경하는 부분이 많아서 시간초과가 났던 것 같다.
결론적으로는 코드가 필요 없는 부분들이 많은 난잡한 코드라 문제 풀이에 적합한 코드가 아니라고 생각하게 되었다.
그래서 처음 작성한 코드를 수정하기 보다는 다른 풀이방법을 생각해보게 되었고, 다음과 같은 생각을 하게 되었다.
- 우선 5의 배수들의 리스트를 담은 리스트를 만든다.
- 반복문을 활용해서 각각의 인덱스의 값들을 가져와서 자리수를 비교한다.
- 각각의 자리수가 0이나 5가 아니라면 해당되는 인덱스를 삭제한다.
그런데 여기서는 다음과 같은 문제가 발생했다.
이미지에 있던 부분은 데이터 타입을 오해해서 논리 연산자 부분에서 잘못 실행이 되었었다. 데이터 타입을 문자형으로 바꿨더니 원하는대로 수행이 되었다. 하지만 진짜 문제는 다음 remove부분이었다. remove가 실행되면 list에 있는 값을 삭제하게 된다. 그러면 뒤에 있던 인덱스들이 앞으로 당겨지기 때문에 반복문이 원하던대로 작동하지 않았다.
예를 들어 {1, 2, 3}인 리스트에서 list.remove(1)을 하게 되면 {1,3}이 되고,
결국 list의 1번 인덱스 값은 3으로 바뀌는 것이다..
해결
위와 같은 삽질(?)을 얼마동안 반복한 결과 다음과 같은 풀이를 생각하게 되었다.
- 우선 5의 배수들의 리스트를 담은 리스트를 만든다.
- 반복문을 활용하여 각각의 자리수가 0이나 5가 아니라면 해당되는 인덱스의 값을 1로 바꾸는 것이다.
- 예를 들어, 125는 2가 0이나 5가 아니므로 125였던 인덱스 값이 1이 되는 것이다.
- 이런 과정을 거친 리스트에서 1에 해당하는 인덱스를 모두 지운다.
작성한 코드는 다음과 같다.
import java.util.*;
class Solution {
public int[] solution(int l, int r) {
List<Integer> list = new ArrayList<>();
for (int i=l; i<=r; i++) {
if(i%5==0) {
list.add(i);
}
}
for (int i=0; i<list.size(); i++) {
String a = list.get(i)+"";
for (int j=0; j<a.length(); j++) {
if (a.charAt(j) != '0' && a.charAt(j) != '5') {
list.set(i, 1); //인덱스 값을 1로 바꾼다.
break;
}
}
}
List<Integer> list2 = new ArrayList<>();
list2.add(1); //1을 갖고있는 list생성
list.removeAll(list2); //list에서 1값을 전부 뺀다.
int[] result;
if (list.size() != 0) {
result = new int[list.size()];
for (int i=0; i<list.size(); i++) {
result[i] = list.get(i);
}
} else {
result = new int[1];
result[0] = -1;
}
return result;
}
}
결과는 .. 드디어 1주일만에 통과...! 감격스러웠다...증말...
위의 코드도 좋은 코드인지는 판단할 수 있는 레벨은 아니지만.. 통과가 되었다는 사실만으로 기뻤다.
알게된 것
우선 내가 나중에 코딩 테스트를 볼 때 정말 생각하지도 못한 오류를 만날 수 있고,
내 생각으로 오류가 없다고 생각하는 로직들도 내가 모르는 오류가 있을 수 있다는 사실을 알게 되었다.
또한, 너무 한 가지 방법으로만 고민하지 말고, 다양한 시각에서 문제를 접근할 수 있는 능력을 키워야겠다고 생각하게 되었다.
위와 같은 능력을 키우려면 역시 많은 문제를 해결해야겠지.. 더 노력하자..!
마지막으로 100문제 돌파 기념.. 캡쳐..
'TIL&WIL' 카테고리의 다른 글
2023-05-25 TIL (Java 문법 학습, 프로그래머스 문풀) (0) | 2023.05.25 |
---|---|
2023-05-24 TIL (Java, 프로그래머스 문제풀이) (1) | 2023.05.24 |
2023-05-22 TIL (Java : 비트 연산자, 배열에서의 복사) (0) | 2023.05.22 |
2023-05 3주차 WIL (0) | 2023.05.19 |
2023-05-19 TIL (Java : Replace, ReplaceAll, ReplaceFirst) (0) | 2023.05.19 |