Question
My Solution
hashset에 s를 담은 후 replace()를 통해 특정 문자를 공백처리 한 것의 길이(num)가 s.length()보다 1 작을 경우 해당 문자의 index를 return한다.
class Solution {
public int firstUniqChar(String s) {
String t =s;
Set<Character> set = new HashSet<>();
for(int i=0;i<s.length();i++){
set.add(s.charAt(i));
}
for(int j=0;j<s.length();j++){
String ss =s;
int num =ss.replace(String.valueOf(ss.charAt(j)), "")
.length();
if(s.length()==num+1){
return j;
}
}
return -1;
}
}
⚠️ 문제 : 27번째 testcase에서 Time Limit Exceeded 발생
int num =ss.replace(String.valueOf(ss.charAt(j)), "")이 오래걸리나?
contains를 사용 못함 → T/F를 반환해 주지 문자 몇개가 포함되어있는지 알려주지 않으니까
겹치는 문자의 개수를 어떻게 찾는지가 관건
Solution (1)
출처 : AMAZON CODING INTERVIEW QUESTION - FIRST UNIQUE CHARACTER IN A STRING (LeetCode)
class Solution {
public int firstUniqChar(String s) {
HashMap<Character,Integer> map = new HashMap<Character, Integer>();
//iterate to string
for(int i=0;i<s.length();i++){
char current = s.charAt(i);
// HashMap에 String 다 넣고 확인x 넣으면서 기존에 있는지 확인하는것
if(!map.containsKey(current) ){
map.put(current,i);}
else{
//invalidate the character ->not unique
//put it in negative one -> not valid, unique
//why using negative one? not a valid index in java -> see ah not valid
map.put(current,-1);
}
}
int min = Integer.MAX_VALUE;
for(char c: map.keySet()){
//if c is smaller than min and valid
if(map.get(c)>-1 && map.get(c)<min){
min = map.get(c);
}
}
// if min == integer.max_value true = return -1, ! return min
return min == Integer.MAX_VALUE ?-1 : min;
}
}
- HashMap<Character, Integer>
key
의 자료형,value
의 자료형- iterate to string 하는 동안 기존에 들어간 key와 current key를 비교
- → 1일차 푼 HashSet에서는 iterate 다 한 다음에 새로 for문 만들어서 문자 하나씩 비교했는데… 차이가 있음
- map이 current key 포함하면 unique하지 않아짐 → value -1를 넣음
- current key 포함 x unique → value 해당 index = i를 넣음
- 최소 index를 찾기 (min값과 index 비교)
map.keySet()
map에 있는 모든 key 꺼냄 map.get(key)
key의 value 가져옴min = Integer.MAX_VALUE;
(정수의 최댓값 나타냄 → 2^31)- min==Integer.MAX_VALUE이면 return -1, 아니면 return min
Solution(2)
출처 : by kevin 유튜브 댓글
- String str을 charArray[]에 아스키코드로 인덱싱 해서 넣음→ 중복되는게 있으면 해당 문자의 인덱스 value가 1보다 커질 것
- freqTable[c-’a’]++;
- 배열의 값이 1이면 unique / 아니면 누적시켜서 return -1;
FeedBack / Comment
[Java] HashMap, HashSet 이란? - (5) HashMap과 HashSet의 차이
- Set vs Map
- Set
- 데이터를 모은 집합
- 데이터들간 순서 x
- 중복 데이터 포함 x
- Map
- key-value로 데이터 저장
- key를 이용해 value 얻음 → 검색 개념 강함
- key unique, value 중복 가능
- 데이터들간 순서 x
- Set
- HashSet vs HashMap ?
- 둘다 데이터 접근에 O(1)을 보장
- HashSet
- implements Set interface
- entitiy mapping → 중복 허용 x
- 단하나의 Null
- HashMap
- implements Map interface
- key-value mapping → value 중복 허용
- key null 1개만 / value null 여러개
- Uniqueness 유지에 Set보다 선호
- 3. why HashMap?
- unique한 단어를 찾는 문제
- index를 알고, 찾아야 하는 문제
- 더 알아보기
Related Concept
HashMap
- Map interface를 구현
- Map의 특징 :
- key- value 구성된 entity 저장
- key 중복저장 x, value 중복 저장 o
HashMap 사용법
- HashMap<Key자료형, Value 자료형> map = new HashMap<>();
map.put(key, value)
: 값 추가map.get(key)
: key에 해당하는 value 값 가져옴map.keySet()
: map의 모든 key값 가져옴map.containsKey(key)
: map에 해당 key가 있는지 확인map.containsValue(value)
: map에 해당 value가 있는지 확인
'알고리즘' 카테고리의 다른 글
[이것이 코딩 테스트다] 꼭 필요한 자료구조 기초 ( 스택, 큐) (0) | 2022.04.05 |
---|