메뉴로 건너 뛰기 내용으로 건너 뛰기
커뮤니티 COMMUNITY
제목 [Jason Lee] enigma code 써봤는데 무엇이 문제인지 모르겠습니다..
CSA Enigma 5
작성자 Glo*** 등록일 2025-01-15 오후 8:57:51

안녕하십니까 선생님. 항상 친절한 답변 정말 감사드립니다..

다름이 아니라 선생님께서 항상 강조하시던 대로 강의를 듣고 저 스스로 복습겸 enigma를 다시 만들어 보고 있었습니다..

만든 후 선생님 code랑 비교를 해 보았는데, 대부분의 알고리즘은 비슷하게 사용한 것 같은데..

도대체 왜 제가 만든 enigma에서는 문제가 생기는지 알 수가 없습니다..ㅠㅠ

decode는 이름만 제외하면 선생님께서 강의에서 알려주신것과 똑같고..

그렇다고 encode에서 문제가 있는것 같지 않은데.. 실행을 해보면 이렇게 됩니다..


System.out.println(e.decode( e.encode(str) ) );

를 했을때와


ArrayList<Integer> coded = new ArrayList<Integer>();

System.out.println(e1.decode(coded));

를 했을때 차이가 발생합니다. 전자의 경우 답이 두개가 나오는 반면, 후자의 경우 잘 작동합니다.

첨부한 사진처럼 말입니다..

둘 다 같은 거 아닌가요..? 도대체 왜 이런 문제가 발생할까요..ㅠㅠ


..3시간 동안 혼자 찾아봤는데도 이해가 안 돼서 실례를 무릎쓰고 여쭤봅니다..ㅠㅠ 



+ 선생님 말씀이 맞는 것 같습니다!! 선생님 말씀대로 해보니 잘 작동하네요.. 정말 감사합니다..ㅠㅠ 한번 instantiate 된 object에 class variable의 정보는 계속 남아 적충되는 것이었군요.. 심지어 하필 encode가 ArrayList라 add를 썼기에 두번 된 것 같습니다.. 많은 것을 배웠습니다. 바쁘실텐데 친절한 답변 정말로 감사드립니다!!

첨부파일 무엇이문제인지...png
첨부파일 무엇이문제인지2.png
2025-01-17 오후 6:12:32

상당히 재미있는 에러인데 말이죠 ^^

encode 라는 class variable 이 문제에요.

class variable 은, object 가 생성된 다음 계속 유지가 되기 때문에, 기존 encode 의 결과를 포함해요.

예를 들어, 지금 상황이라면, 

e.encode(str) 이걸 세번 부르면 hihihi, 네번 부르면 hihihihi 이렇게 나올거에요.

첫번째 블록에서는 

System.out.println(e.encode(str) ); <<= 요기서 한번

System.out.println(e.decode( e.encode(str) ) ); <<= 요기서 두번째

불러진 상태이기 때문에, 처음 불려질 때 list 가 [23,6] 이고

두번째 줄에서 [23,6,23,6] 이 된 상태이겠죠

두번째 블록에서는 e1.encode 가 한번만 실행되어서 제대로 된거구요 ^^

 

픽스하는 것은 두가지:

1. encode() 메소드에서, 시작할 때 encode = new ArrayList... 를 통해 새로 초기화해주는 방법

2. encode() 는 한번씩만 부르고, encode 라는 variable 을 리턴해주는 getter method 를 추가해서, 단순히 리스트를 보고 싶을때는 그걸 사용하는 방법.

 

사실은, 이보다는 아예 encode 라는 class variable 을 안 사용하는 것이 좋을 수도 있어요. ^^

 

let me know how it goes!!

 

Top