링크 : 프로그래머스 > Level 1 > 바탕화면 정리
import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;
class Solution {
public int[] solution(String[] wallpaper) {
return new int[]{
top(wallpaper),
left(wallpaper),
bottom(wallpaper) + 1,
right(wallpaper) + 1
};
}
private static int left(String[] wallpaper) {
int left = Arrays.stream(wallpaper)
.mapToInt(line -> line.indexOf('#'))
.filter(find -> find != -1)
.min()
.orElse(-1);
assert left != -1;
return left;
}
private static int top(String[] wallpaper) {
int top = IntStream.range(0, wallpaper.length)
.filter(i -> wallpaper[i].contains("#"))
.findFirst()
.orElse(-1);
assert top != -1;
return top;
}
private static int right(String[] wallpaper) {
int right = Arrays.stream(wallpaper)
.mapToInt(line -> line.lastIndexOf('#'))
.filter(find -> find != -1)
.max()
.orElse(-1);
assert right != -1;
return right;
}
private static int bottom(String[] wallpaper) {
int bottom = IntStream.iterate(wallpaper.length - 1, i -> i - 1).limit(wallpaper.length)
.filter(i -> wallpaper[i].contains("#"))
.findFirst()
.orElse(-1);
assert bottom != -1;
return bottom;
}
}
어떻게 해결할지 보다, 문제 자체를 바르게 이해하지 못해서 혼란을 겪은 부분이 컸던 것 같다. 크게 아래 3가지 내용에 혼돈을 겪어 문제를 어렵게 바라보게 되었다.
위에서 기록했지만 문제와 여러 제약사항을 잘못 이해함으로 매우 쉬운 문제를 매우 어렵게 바라보게 되었다. 문제를 해결하는 기술적인 칼날이 예민하고 기술적인 자유도가 높은 것도 중요하지만 문제 자체를 제대로 이해하는 능력이 먼저 중요함을 다시 한 번 느낀다.
자꾸 이런 유형의 문제를 내가 왜 풀어야하는지 그만하고 싶은 생각이 들었다. 잘못된 유혹이다. 분명히 도메인의 문제와 제약사항 등을 바르게 이해하지 못하는 나의 약점을 드러내 주고 있고 글을 읽고 문제를 바르게 파악하는 연습이 되고 있다. 뿐만 아니다. Java 언어의 다양한 라이브러리를 자유롭게 활용하지 못하고 있는 약점도 있었는데 점점 문제를 해결하는 도구를 날카롭게하고 또한 기술적인 자유도도 훨씬 커져 가는 것을 느낀다. 꾸준히 지속하면 좋은 개발자가 되는데 도움이 된다고 생각한다.
문제 푸는 것을 거의 포기할 뻔 했을 때 ChatGPT가 준 힌트 하나가 나를 다시 일어서게 했다. 문제를 완전히 잘못 이해하고 있었다. 이후에도 여러 문제들을 해결할 Java API(String::lastIndexOf, Stream::Iterate 등)를 찾는데 ChatGPT가 큰 도움이 되었다.