211113 토 Algorithms TIL
https://bong-f.tistory.com/324
프로그래머스 카카오 2018
뉴스클러스터링
두 번째 풀고 나서
- 코드
- 문제
- 카카오해설
- 다른이풀이
- 지난번에 풀어보고 다시 풀어보니 풀이가 훨씬 나아졌다.
- 그래도 other의 풀이는 연습해 보는 것으로 하자 자바나 파이썬으로 set을 구하는 부분이나, java에서 frequency는 어떻게 구하는지, 자바에서 교집합 합집합은 어떻게 구하는지를 알아야 한다.
내 풀이
- 1단계, 특수문자나 공백 버리기, 대소문자 통일하기 -> 두글자짜리 문자로 만들어서 리스트에 담기
- 2단계, Counter 함수로 각각의 원소에 대해서 개수를 구한다음에 str1 로 만든 리스트를 돌면서 이것이 교집합이면 최소값을 분자에 더해주고, 최대값을 분모에 더해주고, 공통 부분이 아니라면 해당 값을 분모에 더해준다.
- st2도 돌면서 이제 교집합이 아닌 부분만 더해주면 되므로 (교집함은 이전에 처리했으니까) 해당 개수를 분모에 더해준다.
다른 사람 풀이
- 일단 나와 다른점 우선 두글자짜리 문자열로 만들고 그것이 알파벳인지만 확인한다.
- "Aa"같이 대소문자 섞여 있어도 그것은 isalpha() 값이 true이다.
print("aA".isalpha()) ##True
list1 = [str1[n:n+2].lower() for n in range(len(str1)-1) if str1[n:n+2].isalpha()]
- 그 다음에 만든 두 리스트를 set으로 만들어서 합집합과 교집합을 만들어버린다. 여기서는 set으로 만들었기 때문에 개수는 의미가 없고 해당 요소가 교집합에 포함되는지 합집합에 포함되는지만 중요하다.
gyo = set(str1) & set(str2)
hap = set(str1) | set(str2)
- 이 합집합과 교집합에 포함될 요소들을 탐색하면서 각각 아까 만들어둔 리스트에서 해당 요소의 개수를 센다. 두 리스트 중에 작은 값의 수는 교집합의 분자로, 큰 값은 교집합의 분모로 들어간다. (이 부분은 내 풀이와 같다. 중요한 건. 나는 원소 수를 하나씩 순회해가면서 했다는 것 좋았던 풀이는 아예 그냥 합집합 교집합으로 만들어놓고 counter()로 썼다는 것)
- 내 풀이와 비교했을 때 메모리를 조금 더 쓰는 것 말고는 큰 차이가 없다. 이 좋은 풀이를 이용하자
Learned - Python
- 교집합, 합집합, 차집합
https://wikidocs.net/1015
def practice():
s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])
gyo = set(s1) & set(s2)
gyo2 = set(s1).intersection(s2)
hap = set(s1) | set(s2)
cha = set(s1) - set(s2)
print(gyo) ## {4, 5, 6}
print(gyo2) ## {4, 5, 6}
print(hap) ## {1, 2, 3, 4, 5, 6, 7, 8, 9}
print(cha) ## {1, 2, 3}
Learned - Java
교집합, 합집합 -> to new set
public static void makeAnotherSet() {
List<Integer> list1 = Arrays.asList(1, 2, 3, 4);
List<Integer> list2 = Arrays.asList(3, 4, 5, 6);
Set<Integer> gyo = new HashSet<>();
Set<Integer> hap = new HashSet<>();
hap.addAll(list1);
hap.addAll(list2);
gyo.addAll(list1);
gyo.retainAll(list2);
System.out.println(hap); // [1, 2, 3, 4, 5, 6]
System.out.println(gyo); // [3, 4]
}
빈도세기 frequency
- element 요소 개수 세기
- count the number of occurrences of an element in a List
- https://stackoverflow.com/questions/505928/how-to-count-the-number-of-occurrences-of-an-element-in-a-list
public class CountOccurrence {
public static void main(String[] args) {
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 1, 1);
int frequency = Collections.frequency(list1, 1);
System.out.println(frequency); // 3
}
}
Author And Source
이 문제에 관하여(211113 토 Algorithms TIL), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@bongf/211113-Algorithms-TIL저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)