문제:

비어있는 공집합 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

 

'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

문제:

 창영이는 민균이의 컴퓨터를 해킹해 텍스트 파일 하나를 자신의 메일로 전송했다. 파일에는 단어가 한 줄에 하나씩 적혀있었고, 이 중 하나는 민균이가 온라인 저지에서 사용하는 비밀번호이다.

 

파일을 살펴보던 창영이는 모든 단어의 길이가 홀수라는 사실을 알아내었다. 그리고 언젠가 민균이가 이 목록에 대해서 얘기했던 것을 생각해냈다. 민균이의 비밀번호는 목록에 포함되어 있으며, 비밀번호를 뒤집어서 쓴 문자열도 포함되어 있다.

 

예를 들어, 민균이의 비밀번호가 "tulipan"인 경우에 목록에는 "napilut"도 존재해야 한다. 알 수 없는 이유에 의해 모두 비밀번호로 사용 가능하다고 한다.

 

민균이의 파일에 적혀있는 단어가 모두 주어졌을 때, 비밀번호의 길이와 가운데 글자를 출력하는 프로그램을 작성하시오.

 

입력:

첫째 줄에 단어의 수 N(2<=N<=100)이 주어진다. 다음 N개의 줄에는 파일에 적혀있는 단어가 한 줄에 하나씩 주어진다.

단어는 알파벳 소문자로만 이루어져 있으며, 길이는 2보다 크고 14보다 작은 홀수이다.

 

출력:

첫째 줄에 비밀번호의 길이와 가운데 글자를 출력한다. 항상 답이 유일한 경우만 입력으로 주어진다.

 

풀이방법:

 처음 단어를 받을때 원래 단어와 뒤집은 단어 두개씩 넣도록 하였다. 이렇게 한다면 비밀번호인 단어는 words라는 배열에 두 개씩 담기게 될 것이다.

 그리고 이 words라는 배열에 set을 취하게 되면 중복인 것들이 사라지게 되고, words에 set을 한번 한 배열을 빼면 비밀번호인 문자만 남게 될 것이다. 항상 홀수 길이의 단어이므로 둘 중 어느것의 가운데 글자를 출력해도 상관없으니 아무 것이나 선택해서 출력하도록 했다.

1
2
3
4
5
6
7
8
9
10
words=[]
for i in range(int(input())):
    word=input()
    ReWord=word[::-1]
    words.append(word)
    words.append(ReWord)
 
for word in list(set(words)):
    words.remove(word)
print(len(words[0]),words[0][len(words[0])//2])
cs

문제링크:

https://www.acmicpc.net/problem/9933

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

[BOJ]14501. 퇴사  (0) 2019.09.11
[BOJ]1371. 가장 많은 글자  (0) 2019.09.10
[BOJ]2178. 미로찾기  (0) 2019.09.08
[BOJ]2667. 단지번호붙이기  (0) 2019.09.07
[BOJ]2331. 반복 수열  (6) 2019.09.06

문제:

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.
홍 박사님 연구실의 폰켓몬은 종류에 따라 번호를 붙여 구분합니다. 따라서 같은 종류의 폰켓몬은 같은 번호를 가지고 있습니다. 예를 들어 연구실에 총 4마리의 폰켓몬이 있고, 각 폰켓몬의 종류 번호가 [3번,1번,2번,3번]이라면 이는 3번 폰켓몬 두 마리,1번 폰켓몬 한 마리, 2번 폰켓몬 한 마리가 있음을 나타냅니다. 이때, 4마리의 폰켓몬 중 2마리를 고르는 방법은 다음과 같이 6가지가 있습니다.

1.첫 번째(3번),두 번째(1번) 폰켓몬을 선택
2.첫 번째(3번),세 번째(2번) 폰켓몬을 선택
3.첫 번째(3번),네 번째(3번) 폰켓몬을 선택
4.두 번째(1번),세 번째(2번) 폰켓몬을 선택
5.두 번째(1번),네 번째(3번) 폰켓몬을 선택
6.세 번째(2번),네 번째(3번) 폰켓몬을 선택

이때, 첫 번째(3번) 폰켓몬과 네 번째(3번) 폰켓몬을 선택하는 방법은 한 종류(3번 폰켓몬 두 마리)의 폰켓몬만 가질 수 있지만, 다른 방법들은 모두 두 종류의 폰켓몬을 가질 수 있습니다. 따라서 위 예시에서 가질 수 있는 폰켓몬 종류 수의 최댓값은 2가 됩니다.
당신은 최대한 다양한 종류의 폰켓몬을 가지길 원하기 때문에, 최대한 많은 종류의 폰켓몬을 포함해서 N/2 마리를 선택하려 합니다. N마리 폰켓몬의 종류 번호가 담긴 배열 nums가 매개변수로 주어질 때, N/2마리의 폰켓몬을 선택하는 방법 중, 가장 많은 종류의 폰켓몬을 선택하는 방법을 찾아, 그때의 폰켓몬 종류 번호의 개수를 return 하도록 solution 함수를 완성해주세요.

풀이 방법:

이 문제는 크게 두 가지 경우가 있다. 폰켓몬의 종류의 갯수가 N/2마리보다 큰 경우와 작은 경우이다.
폰켓몬의 종류의 갯수가 N/2마리 보다 크다면 N/2마리를 선택하면 된다. 최대 선택할 수 있는 종류는 N/2이기 때문이다.
폰켓몬의 종류의 갯수가 N/2마리 보다 작다면 폰켓몬의 종류의 갯수를 선택하면 된다. 아무리 N/2마리를 골라도 중복이 발생하고 이를 제거 하면 결국 최댓값은 폰켓몬의 종류의 갯수가 되기 때문이다.
그렇다면 폰켓몬의 종류의 갯수를 구하는 것이 중요한데, python에서 중복을 제거 할 수 있는 가장 좋은 방법은 set을 이용하는 것이다. python의 자료형 중 집합 자료형인 set은 중복을 허용하지 않고, 정렬이 되어 있지 않다는 것이다. 따라서 nums를 set으로 한번 감싸고 난 뒤의 길이를 이용해서 N/2와 비교하면 된다.

1
2
3
4
5
def solution(num):
    if len(list(set(num))) < len(num)/2:
        return int(len(list(set(num))))
    else:
        return int(len(num)/2)
cs
 


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

[Programmers]Lv 2.숫자의 표현  (0) 2019.03.12
[Programmers] Lv 3. 멀리 뛰기  (0) 2019.03.11
[Programmers]Lv 3.베스트앨범  (0) 2019.03.09
[Programmers]Lv 2.땅따먹기  (0) 2019.03.08
[Programmers] Lv 3. 등굣길  (2) 2019.03.07


2019/01/12 - [Language/Python] - [Python 따라하기]1. Python 설치하기


2019/01/21 - [Language/Python] - [Python 따라하기] 2. 자료형_part 1(String, Int,Float, List)


Tuple형

튜플은 값을 변경시킬 수 없다는 점을 제외하고는 리스트와 동일하다. 여기서 '값을 변경시킬 수 없다'라는 것은 값을 수정, 변경, 삭제를 할 수 없다는 것이다.


리스트와 동일하게 인덱싱과 슬라이싱을 할 수 있지만 값을 변경시키는 것은 불가능하다.



리스트와 같이 덧셈과 곱셈의 사칙연산을 지원한다.



 Tuple 자료형은 값을 변경시킬 수 없다는 점이 가장 큰 특징이며, 이 점을 이용해서 값이 변하면 안되는 것, 혹은 잘 변하지 않는 값을 사용하는 경우에 사용한다.


Set(집합형)

Set은 집합 자료형으로 집합에 관련된 연산을 지원해준다. set() 연산자를 이용하거나 {}를 사용해서 집합 자료형을 사용하며 2가지의 큰 특징이 있다.

1.순서가 없다

2.중복이 없다.


 '순서가 없다'라는 특징은 위의 Hello 와 같이 set으로 자료형을 변환하면서 각 글자의 위치가 달라졌다는 것을 의미한다. 따라서 '순서가 있다' 라는 특징을 가지는 리스트와 튜플과 달리 인덱싱과 슬라이싱 기능을 사용할 수 없다.


'중복이 없다'라는 특징은 Hello 두 개의 l 이 있지만 set 자료형에서는 하나의 l 만 있는 것을 확인 할 수 있다. 따라서 이 점을 이용해서 다른 자료형의 중복을 제거하기 위해 사용한다.


집합 사칙연산

집합 자료형이므로 교집합, 합집합, 차집합과 같은 연산을 지원한다.

교집합

두 집합 사이의 공통된 요소를 반환한다. & 를 사용하거나 intersection()을 사용한다.

합집합

두 집합을 합치는 작업을 수행한다. | (shift + \ )을 사용하거나 union()을 사용한다.

차집합

두 집합의 차를 수행한다. - 연산자를 사용한다.


내장함수

값 추가하기

하나의 값을 추가할 경우 add()를 사용하고 여러 값을 추가해야 할 경우 update()를 사용한다.

값 제거하기

값을 제거하고 싶을 경우 remove를 사용하면 된다.


Dictionary

Dictionary 자료형은 key 값과 value 값으로 구분되어져 있다. 즉 과일에 대한 dict 자료형이라고 하면 사과의 갯수 4개, 바나나의 갯수 5개...와 같이 대응 관계를 가지고 있는 자료형이다. 이와 같은 자료형을 다른 프로그래밍 언어에서는 해쉬(Hash)라고 부른다. 다음과 같이 사용하며 상당부분 set과 비슷한 성질을 가지고 있다.



일반 적으로 key에는 변하지 않는 값을 value에는 변하는 값을 넣도록 한다.

딕셔너리 자료형에 값은 다음과 같이 추가 및 제거를 한다.


딕셔너리도 set과 같은 성질을 가지고 있기 때문에 숫자로 인덱싱과 슬라이싱을 할 수 없다. 대신 key 값을 통해서 value 값에 접근 할 수 있다.


또한 중복을 허용하지 않으므로 같은 key 값은 존재할 수 없다.



내장 함수

key 리스트 만들기

keys()는 딕셔너리의 key 값들만 모아서 리스트로 반환을 한다. 이 때 우리가 알고 있는 list 자료형이 아닌 dict_keys라는 객체로 반환하는데 리스트와 동일하게 반복문에서 사용할 수 있다. 이를 리스트로 만들고자 하면 list()함수를 사용하도록 한다.


value 리스트 만들기

values()는 딕셔너리의 value 값들만 모아서 리스트로 반환을 한다. keys()와 마찬가지로 dict_values로 반환을 하고 동일하게 사용한다.

item 리스트 만들기

items()는 딕셔너리의 쌍들을 모아서 tuple로 묶어 리스트로 반환을 한다. keys()와 마찬가지로 dict_items로 반환을 하고 동일하게 사용한다.


+ Recent posts