211113 토 Algorithms TIL

bongf·2021년 11월 13일
0

알고리즘TIL

목록 보기
29/153

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

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

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
    }
}
profile
spring, java학습

0개의 댓글