카테고리 없음

9. JAVA로 백준 풀기 (1)

young313 2022. 7. 24. 20:00

2021.8.15 업로드 재업

 

 

백준 문제를 본격적으로 풀면서 막히는 문제도 있었고 비교적 쉽게 풀었던 문제도 있었다. 푸는 모든 문제를 블로그에 정리 할 생각은 없고 (개인적으로 노트에 정리 중이기 때문에) 문제를 풀면서 내가 생각하지 못한 풀이 방법이나, 새로운 문법 등을 정리하면서 복습 할 계획이다.


백준 문제를 정리하기 전에, 지난주 오랜만에 학교 상담 프로그램을 통해서 진로 상담을 받았다. 이 블로그의 시작이었던 지난 상담과는 다르게, 이번 상담은 내가 어느 정도 생각을 가지고 임했던 상담이어서 더 얻은 것이 많았다. 오랫동안 고민하던 부전공과 복수 전공에 대해서도 개인적으로 생각을 정리했고 교수님과 따로 상담을 하는 시간도 가졌다. 감사하게도 1시간 가까이 나에게 시간을 내어 주셔서 뜻깊은 상담 시간을 보냈다! 비전공자이기 때문에 우선 프로젝트나 경험 면에서 양과 질을 모두 챙겨야 한다는 결론을 내고 더 열심히 공부하기로 마음 먹었다 :)


다시 본론으로 돌아와서 백준 3052번 문제를 풀이하고 정리해보려한다.

 

 

배열 part에 들어있는 문제로, 입력받은 각 요소를 42로 나눴을 때 서로 다른 나머지의 개수를 출력하는 문제이다. 즉 중복되는 나머지가 있다면 하나로 카운트를 한다는 것이다. 처음 이 문제를 봤을 때는 HashSet을 사용해서 add를 통해 문제를 풀면 되겠다고 생각했다. HashSet HastSet<type>으로 생성하고 저장하는 집합이라고 생각하면 된다. 다만 중복된 요소는 한 번만 저장하고 순서를 보장하지 않는 집합이다. 따라서 이 문제에 적합한 방법이라고 생각했고 실제로 구현에 성공했다.

 

HashSet을 이용한 풀이

 

데이터타입이 Integer인 HashSet을 생성하고 이를 변수 h에 저장했다. 이후 h.add()를 이용해 요소를 h에 저장했고 마지막에 h.size()를 이용해 저장된 데이터의 개수를 세서 문제를 풀었다.

 

또 다른 풀이가 있을까 하는 생각에 구글링을 통해 다른 풀이를 찾아보던 중에 개인적으로 인상깊은 풀이가 있어서 그 방법을 이용해봤다. 사실 다른 사람들에게 신박한 방법이 아닐 수 있겠지만 내 기준에서 너무 인상깊은 풀이였다.

 

boolean 타입의 배열을 이용한 풀이

 

boolean 타입의 배열을 만들고 42로 나누었을 떄 나머지가 42개가 나올 수 있기 떄문에 배열의 개수를 42개로 선언한다. 그리고 이때 나머지가 인덱스가 된다. 즉 1은 42로 나누었을 때 나머지가 1이기 때문에 boolean 타입의 배열인 arr 에서 arr[1]에 해당하는 것이다. 이런 방식으로 해당 인덱스의 값을 true로 설정하게 되면 이후에 중복된 나머지가 나와도 true를 다시 true로 하는 격이기 때문에 중복이 큰 의미가 없게 된다. 따라서 42개의 값을 가지는 배열에서 ( arr=[false, true,true,false ... ]이런 식이 될 것이다) true의 개수를 세면 나머지의 개수가 중복되지 않게 카운트 되므로 위의 두 코드는 같은 값을 가지게 된다.

 


코딩에는 하나의 풀이만 존재하는 것이 아니기 때문에 답을 맞추더라도 다른 풀이를 찾아보는 습관을 들이려 노력하고 있다. 문제를 많이 풀고 다양한 풀이를 이용하면서 지금 신박하다고 느끼는 풀이들이 내 머리속에서 나오면 좋겠다..!!ㅋㅋㅋ

 

현재는 생활코딩 java 강의를 완강한 상태다. 강의만 들을 때 보다 문제를 풀면서 배운 개념들을 활용하니 공부가 더 잘 되는 기분이다. 개강할 때까지 꾸준히 알고리즘 문제를 풀면서 javascript 강의도 병행할 예정이다!!