본문 바로가기
PS/BOJ

백준 1501 자바 - 영어 읽기 (BOJ 1501 JAVA)

by Nahwasa 2021. 11. 12.

문제 : https://www.acmicpc.net/problem/1501

코드 : https://github.com/NaHwaSa/BOJ_BaekjunOnlineJudge/blob/master/01500/BOJ_1501.java

 

  문제 자체는 해싱처리만 알면 풀 수 있는 문제인데, 설명이 너무 불명확하다 ㅡㅡ.. N개의 단어에 포함되지 않는 단어가 포함된 문장은 '0'을 출력해야한다.. 대체 문제 어디에 그 내용이 적혀있는데 ㅠ 뭐 굳이 억지로 찾아보자면 '각각의 단어들이 실제로 존재하는 단어(사전에 존재하는 단어)일 경우에만 의미가 있다.' 부분일 것 같긴하다만..

 

1. 첫 문자와 끝 문자는 무조건 같아야 한다. 그 내부의 문자들은 소문자 a~z, 대문자 A~Z로 나눠서 카운팅하면 ababa, aabba와 같은 문자에 대해 동일한 형태로 만들 수 있다.

 

2. 소문자랑 대문자 총 개수 해봐야 26+26개 이므로 사실 따로 해싱함수를 만들지 않고 String 같은걸로 고유한 문자로만 만들어도 된다. 예를들어 ababa -> a120000...000a 라던지 (맨 앞과 맨 뒤는 같아야 하므로 그대로 두고, 나머지 숫자는 소문자 a~z 각각의 갯수와 대문자 A~Z 각각의 갯수 처럼)

 

3. 오랜만에 해싱처리도 해볼 겸 난 hashCode와 equals를 오버라이드해서 클래스에 대한 해싱처리를 해봤다. hashCode는 '1'과 같이 첫문자, 끝문자, 그 안의 문자에 대한 카운팅이 같다면 항상 동일한 숫자만 나오게 하면 된다. 그리고 해싱처리를 해도 겹치는 문자가 생길 경우가 있으므로 equals도 마찬가지로 구현해야 한다. 이건 뭐 해당 조건만 만족하면 어떻게 짜든 상관없다. 어차피 입력 갯수도 얼마 안되서 대충해도 통과 가능하다. 그냥 해싱에 대한 맛배기 문제!

 

댓글