728x90
반응형

문제:

비어있는 공집합 S가 주어졌을 때, 아래 연산을 수행하는 프로그램을 작성하시오.

  • add x: S에 x를 추가한다. (1 ≤ x ≤ 20) S에 x가 이미 있는 경우에는 연산을 무시한다.
  • remove x: S에서 x를 제거한다. (1 ≤ x ≤ 20) S에 x가 없는 경우에는 연산을 무시한다.
  • check x: S에 x가 있으면 1을, 없으면 0을 출력한다. (1 ≤ x ≤ 20)
  • toggle x: S에 x가 있으면 x를 제거하고, 없으면 x를 추가한다. (1 ≤ x ≤ 20)
  • all: S를 {1, 2, ..., 20} 으로 바꾼다.
  • empty: S를 공집합으로 바꾼다. 

입력:

첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다.

둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.

출력:

check 연산이 주어질때마다, 결과를 출력한다.

풀이방법:

python의 set의 내장함수를 적절히 사용하면 쉽게 풀 수 있다.

1. add : set의 add를 사용한다. python의 set은 중복을 지원하지 않기 때문에 x가 이미 있는 경우에는 중복으로 들어가지 않는다.

2. remove : set에서 원소를 제거하는 방법은 remove와 discard가 있다. remove는 원소가 없는 경우 에러를 반환하지만 discard를 그렇지 않다. 따라서 discard를 사용한다.

3. check : python의 in 기능을 사용한다.

4. toggle : 1. add, 2. remove, 3.check의 기능을 적절히 활용하면 된다. 이 명령어에서 원소를 제거하는 경우에는 항상 있다는 보장이 있으므로 remove를 사용했다.

5. all : S를 재정의한다.

6. empty: S를 재정의한다.

연산의 수가 매우 많으므로 sys.stdin.readline()를 사용해서 빠른 입력을 사용한다.

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
import sys
 
= int(sys.stdin.readline())
=set()
for _ in range(M):
    command = sys.stdin.readline().split()
    if command[0]=="add":
        S.add(int(command[1]))
    elif command[0== "remove":
        S.discard(int(command[1]))
    elif command[0== "check":
        if int(command[1]) in S:
            print(1)
        else:
            print(0)
    elif command[0== "toggle":
        if int(command[1]) in S:
            S.remove(int(command[1]))
        else:
            S.add(int(command[1]))
    elif command[0== "all":
        S = set(list(range(1,21)))
    elif command[0== "empty":
        S = set()
    else:
        print("Invalid command")
cs

문제링크:

www.acmicpc.net/problem/11723

 

11723번: 집합

첫째 줄에 수행해야 하는 연산의 수 M (1 ≤ M ≤ 3,000,000)이 주어진다. 둘째 줄부터 M개의 줄에 수행해야 하는 연산이 한 줄에 하나씩 주어진다.

www.acmicpc.net

 

728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[BOJ]1613. 역사  (0) 2020.12.31
[BOJ]13908. 비밀번호  (0) 2020.12.29
[BOJ]1527. 금민수의 개수  (0) 2020.12.22
[BOJ]7453. 합이 0인 네 정수  (0) 2020.12.10
[BOJ]2294. 동전 2  (0) 2020.12.08
728x90
반응형

문제:

풀이방법:

 입력으로 들어오는 값들을 다중집합으로 만들어야 한다. 소문자와 대문자의 구분이 필요 없으므로 소문자로 전부 바꾸고 두개씩 끊어가면서 특수문자가 있는지 파악하고 각 배열에 담는다. 

 summation이라는 두 배열의 길이의 합을 구하고 이를 교집합과 뺌으로써 합집합의 크기를 구할 것이다. summation은 공통된 원소를 두 개씩 가지고 있는 것이기 때문이다. 

 반복문을 사용해서 공통된 원소가 있을 때마다 intersect를 하나씩 증가시킨다.

이 두 변수로 자카드 유사도는 다음과 같이 구한다. int(intersect/(summation-intersect)*65536) 이 값을 구하면 답을 얻을 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def solution(str1,str2):
    str1=str1.lower()
    str2=str2.lower()
    str1_set=[]
    str2_set=[]
    for i in range(len(str1)-1):
        if (str1[i]+str1[i+1]).isalpha():
            str1_set.append(str1[i]+str1[i+1])
    for i in range(len(str2)-1):
        if (str2[i]+str2[i+1]).isalpha():
            str2_set.append(str2[i]+str2[i+1])
    summation=len(str1_set)+len(str2_set)
    intersect=0
    for i in str2_set:
        if i in str1_set:
            str1_set.remove(i)
            intersect+=1
    if summation==0:
        return 65536
    else:
        return int(intersect/(summation-intersect)*65536)
cs

 

문제링크:

https://programmers.co.kr/learn/courses/30/lessons/17677

 

728x90
반응형

'Algorithm > Python' 카테고리의 다른 글

[Programmers]2017 Kakao.비밀지도  (0) 2019.09.28
[Programmers]2017 Kakao.캐시  (0) 2019.09.27
[BOJ]1987. 알파벳  (0) 2019.09.25
[BOJ]1759. 암호 만들기  (0) 2019.09.24
[BOJ]14889. 스타트와 링크  (0) 2019.09.23

+ Recent posts