- [백준] - 10988 - 팰린드롬인지 확인하기 2023.10.31
역시나, 스트림 사용하는 것이 익숙하지 않고 많이 부족한 것 같다.
처음 작성한 코드는 아래와 같았다.
List<Integer> origin = spellings.boxed().collect(Collectors.toList());
List<Integer> reverse = origin;
Collections.reverse(reverse);
origin 과 reverse 를 비교해봐도, 둘의 결과가 계속 같았다.
GPT 에게 물어보았다. -> reverse = origin; 은 동일한 객체를 참조 하고 있는걸 뒤집기 때문에 문제다! 라고 했다.
원래 코드에서는 Collections.reverse(reverse);를 사용하여 reverse 리스트를 뒤집는 것이 아니라, reverse 리스트가 origin 리스트와 동일한 객체를 참조하게 됩니다. 이것은 실제로 두 리스트가 같은 데이터를 가리키기 때문에 reverse 또한 변경되면 origin도 변경됩니다.
따라서, Collections.reverse(reverse); 사용 대신에 reverse 리스트를 복제하여 origin의 역순을 만들어야 합니다. 아래는 수정된 코드에서 이것을 어떻게 수행하는지 보여줍니다:
// Create a reversed copy of the origin list
List<Integer> reverse = new ArrayList<>(origin); // Create a new list with the same elements
// Then reverse the 'reverse' list
Collections.reverse(reverse);
한번, 직접 검증해보고 싶어서 테스트를 해보기로 했다.
기존코드는 서로 같은 객체를 참조한다고 리턴했다.
이 때, 서로 같은 객체는 내부의 값이 같음을 비교하는 것이 아니라
두 변수가 참조하는 객체가 동일한 주소에 있다는 것을 말한다.
이 때, == 로 비교해야하며, equals 로 비교하면 내용 비교이므로 조심해야한다.
생각을 해보았는데, 진짜 헷갈린다. 여태껏 별 생각없이 써왔으니까.
침착하게 잘생각해보면, 인스턴스를 새로 생성한것이 아니기 때문에 같은 객체를 참조하는 것이 맞다.
한동안은 체화가 되게 의식하면서 쓰도록 노력해야겠다.
풀고나서 다른 풀이를 보면, 과연 스트림을 사용하는 것이 직관적이고 편한 것은 맞는데.
복잡한 사고를 피하는 건 아닌가 싶기도하다.
package org.example;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//단어
String voca = sc.nextLine();
IntStream spellings= voca.chars();
List<Integer> origin = spellings.boxed().collect(Collectors.toList());
List<Integer> reverse = origin.stream()
.collect(Collectors.collectingAndThen(Collectors.toList(), list -> {
Collections.reverse(list);
return list;
}));
if(origin.equals(reverse)){
System.out.println("1");
}else{
System.out.println("0");
}
}
}
'AREA(지속적인 일상) > 02_백준' 카테고리의 다른 글
[백준] - 2941 - 크로아티아 알파벳 (0) | 2023.11.01 |
---|---|
[백준] - 1157 - 단어공부 (0) | 2023.10.31 |
[백준] - 3003 - 킹, 퀸, 룩, 비숍, 나이트, 폰 (0) | 2023.10.30 |
[백준] - 25083 - 쌔싹 (1) | 2023.10.30 |
[백준] - 27866 - 문자와 문자열 (0) | 2023.10.30 |