티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/17677
문제 자체는 단순 구현문제라 그리 어렵지 않았는데 집합의 특성상 어떤 데이터타입으로 구현하느냐에서 많이 헷갈렸다.
풀기전 아이디어 스케치
처음엔 집합이라 말그대로 Str1과 Str2을 HashSet을 사용해 풀려고했는데 다시 찬찬히 읽어보니 다중집합도 허용한대서 요소끼리 중복도 허용되는 데이터타입을 사용해야했다. 그래서 list를 사용해야하나?했으나 각각의 요소가 몇개 있는지 알아야한다는걸 이후 로직을 구현하면서 깨달았다.
예를 들어 FE가 두개라면 FE:2 이런식으로 데이터를 구현해야하니 이건 hashtable로 구현해야한다.
풀이
코드 자체는 위의 아이디어 스케치를 기반으로 그대로 따라 구현한 것이다. 효율적인 코드는 아닌 것같다. (교집합과 합집합 구하는 부분에서 두번 연산을하니..)
import java.util.*;
class Solution {
public int solution(String str1, String str2) {
int answer = 0;
// 1. str1과 str2를 hashtable로 만들기
Hashtable<String,Integer> str1table = new Hashtable<>();
Hashtable<String,Integer> str2table = new Hashtable<>();
for(int i=0; i<str1.length()-1; i++){
// 첫 번째 글자와 두 번째 글자 분리
String firstChar = str1.substring(i,i+1).toLowerCase();
String secondChar = str1.substring(i+1,i+2).toLowerCase();
// 각 글자 확인
if (firstChar.compareTo("a") < 0 || firstChar.compareTo("z") > 0
|| secondChar.compareTo("a") < 0 || secondChar.compareTo("z") > 0) {
// System.out.println("a와 z사이의 값이 아님"+firstChar+secondChar);
}else{
String ext = str1.substring(i,i+2).toLowerCase();
if(str1table.containsKey(ext) == true){
str1table.put(ext,str1table.get(ext)+1);
}else{
str1table.put(ext,1);
}
}
}
for(int j=0; j<str2.length()-1; j++){
String firstChar = str2.substring(j,j+1).toLowerCase();
String secondChar = str2.substring(j+1,j+2).toLowerCase();
if (firstChar.compareTo("a") < 0 || firstChar.compareTo("z") > 0
|| secondChar.compareTo("a") < 0 || secondChar.compareTo("z") > 0) {
// System.out.println("a와 z사이의 값이 아님"+firstChar+secondChar);
}else{
String ext = str2.substring(j,j+2).toLowerCase();
if(str2table.containsKey(ext) == true){
str2table.put(ext,str2table.get(ext)+1);
}else{
str2table.put(ext,1);
}
}
}
// for (String key : str1table.keySet()) {
// System.out.println("Key1: " + key + ", Value: " + str1table.get(key));
// }
// for (String key : str2table.keySet()) {
// System.out.println("Key2: " + key + ", Value: " + str2table.get(key));
// }
// 2. 교집합과 합집합 구하기 str1table, str2table
Hashtable<String,Integer> mintable = new Hashtable<>();
Hashtable<String,Integer> maxtable = new Hashtable<>();
for (String key : str1table.keySet()) {
// 교집합
if(str2table.containsKey(key) == true){
mintable.put(key,Math.min(str1table.get(key),str2table.get(key)));
}
// 교집합을 구하면서 str1table에 있는걸 합집합으로 옮기고
maxtable.put(key,str1table.get(key));
}
for (String key : str2table.keySet()) {
// 합집합
if(maxtable.containsKey(key) == true){
// 합집합에 존재하는 값과 str2table를 비교해 더 큰 값을 넣어 합집합을 늘림
maxtable.put(key,Math.max(maxtable.get(key),str2table.get(key)));
}else{
maxtable.put(key,str2table.get(key));
}
}
// for (String key : mintable.keySet()) {
// System.out.println("Key: " + key + ", Value: " + mintable.get(key));
// }
// 3. 교집합과 합집합의 value값을 전부 합산
int min = 0;
int max = 0;
for (String key : mintable.keySet()) {
min += mintable.get(key);
}
for (String key : maxtable.keySet()) {
max += maxtable.get(key);
}
// System.out.println("min"+min+"max"+max);
// 4. value값 계산
if(max == 0){
return 65536;
}else{
// float result = min/max * 65536;
return (int) (((double) min /(double) max) * 65536);
}
}
}
일단은 통과
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 빈해쉬맵
- redisTemplate
- 실시간클락
- redis
- 구글
- 구글클라우드스토리지
- 항해커톤
- 해커톤
- 목서버
- 이미지검색
- visionAPI
- ChatGPT
- 데이터잘림
- mockserver
- 조회수기능
- 항해해커톤
- 주피터랩
- 시간어떻게
- 소숫점잘림
- 네이버이미지검색
- 알고있
- 스마트렌즈
- redis-py
- 모의서버
- PC시간어떻게
- 조회수기능개발
- jupyterlab
- crudrepository
- 지도데이터
- 실시간클록
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함