반응형

문제풀이

1.  조합 함수(combination)을 활용하여 가능한 인덱스 조합을 만든다.

2.  각 행에서 1에서 뽑은 인덱스에 해당하는 값들만 추출하여 중복값이 없는지 찾는다. => 유일성

  (set에 넣어서 요소의 수를 총 행의 수와 비교한다.)

3.  각 단계에서 추출된 익덱스 집합이 이전에 선택된 인덱스 집합의 부분집합이 되는 경우는 없는지 확인한다. => 최소성

  (combination을 통해 추출한 조합의 인덱스 개수는 1부터 늘어남으로 이전에 선택된 인덱스 조합만 확인하면 된다.)

 

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from itertools import combinations
 
def solution(relation):
    rows = len(relation)
    cols = len(relation[0])
    keys = []
    
    for n in range(1,cols+1):
        for idxs in combinations(range(cols),n):
            # 최소성 and 유일성
            if min_check(keys,idxs) and \
                    len(set(tuple(relation[row][idx] for idx in idxs) for row in range(rows))) == rows :
                keys.append(idxs)
    
    return len(keys)
 
#최소성
def min_check(keys, target):
    for k in keys:
        if set(k).issubset(set(target)):
            return False
    return True
cs

문제 링크

 

코딩테스트 연습 - 후보키

[["100","ryan","music","2"],["200","apeach","math","2"],["300","tube","computer","3"],["400","con","computer","4"],["500","muzi","music","3"],["600","apeach","music","2"]] 2

programmers.co.kr

 

반응형
반응형

문제풀이

1. orders의 각 요소들에 대하여 길이가 c인 요소들을 만듭니다.

2. 1의 결과물을 tmp라 하면, tmp의 각 요소의 등장 빈도수를 셉니다. (코드에서는 collections.Counter() 함수 사용)

3. 빈도수의 최대값이 2 이상인 경우, 빈도수가 최대값과 같은 요소들을 answer 리스트에 넣어줍니다.

4. 1-3의 과정을 모든 길이에 대하여 반복한 후, answer를 사전 순으로 정렬 후 반환합니다.

 

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# https://programmers.co.kr/learn/courses/30/lessons/72411
from itertools import combinations
from collections import Counter
 
def solution(orders, course):
    answer = []
    for c in course:
        tmp = []
        for order in orders:
            for x in combinations(order, c):
                tmp.append(''.join(sorted(x)))
        # 길이가 c인 조합의 등장 빈도 체크
        counter = Counter(tmp)
        if len(counter.values()):
            # 길이가 c인 조합 중 최대 등장 빈도
            m = max(counter.values())
            if m > 1:
                # 등장 빈도가 최대인 조합들을 answer에 넣는다
                answer += [k for k,v in counter.items() if v==m]
    
    return sorted(answer)
cs

문제링크

 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr

 

반응형
반응형

문제풀이

1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다. 
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다. 
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다. 
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다. 
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다. 
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다. 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다. 
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

위의 각 단계를 함수로 만들어 7단계의 결과를 리턴합니다.

 

Python Code

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# https://programmers.co.kr/learn/courses/30/lessons/72410
 
from string import ascii_lowercase
import re
 
 
def solution(new_id):
    a = list(ascii_lowercase)+['-','_'+'.']
    answer = ''
    id1=make_lower(new_id)
    id2=delete_s(id1)
    id3=delete_double_dot(id2)
    id4=delete_dot(id3)
    id5=fill_blank(id4)
    # [:15] 는 6단계로 id가 15자를 초과하면 첫 15자만 사용합니다.
    id6=delete_dot(id5[:15])
    
    return fill(id6)
 
# 1단계 : 모든 알파벳을 소문자로 바꿔줍니다.
def make_lower(id):
    return id.lower()
 
# 2단계 : 숫자와 -, _, . 을 제외한 특수문자를 제거합니다.
def delete_s(id):
    return re.sub(r"[^a-z0-9-_.]","", id)
 
# 4, 6단계 : 맨 앞/뒤에 있는 .을 제거합니다.
def delete_dot(id):
    while len(id)>0 and id[0]=='.':
        id=id[1:]
    while len(id)>0 and id[-1]=='.':
        id=id[:-1]
    
    return id
 
# 3단계 : ..을 제거합니다.
def delete_double_dot(id):
    a=re.search('\.\.',id)
    while a:
        id=id[:a.span()[0]]+id[a.span()[1]-1:]
        a=re.search('\.\.',id)
    return id
 
# 5단계 : 4단계까지의 결과물이 빈 문자열이라면 a로 바꿔줍니다.
def fill_blank(id):
    return id if len(id)>0 else 'a'
 
# 6단계 : id가 3자 미만이면 3자가 될 때까지 맨 마지막 문자를 붙여줍니다.
def fill(id):
    while len(id)<3:
        id+=id[-1]
    return id
cs

Line 29 : while 문을 활용하며 앞 또는 뒤에 .이 연속으로 있는 경우 모두 제거해줍니다.

Line 38 : while 문을 활용하여 ........ 같은 문자를 해결합니다. 예를 들면, ...을 ..으로 바꾸고 다시 .으로 바꿔줍니다.

 

문제 링크

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

 

반응형
반응형

문제풀이

1. 딕셔너리 자료구조를 활용하여 생성자의 개수를 세어줍니다. 딕셔너리 dic의 key는 생성자가 되고, value는 생성자의 개수가 됩니다.

2. 1부터 10000까지의 숫자 n의 d(n)을 구하여, 위의 딕셔너리에서 key d(n)의 value에 1을 더해줍니다.

3. 1부터 10000까지의 숫자들을 key로 하여, value가 0인 값을 출력합니다.

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sys
from collections import defaultdict
 
dic = defaultdict(int)
def d(n):
    return n + sum(int(s) for s in str(n))
def main():
    for i in range(1,10000):
        dic[d(i)] = dic[d(i)]+1
    for i in range(1,10000):
        if dic[i] ==0:
            print(i)
if __name__ == '__main__':
    main()
cs

Line 8-9 : 과정 2입니다.

Line 10-11 : 과정 3입니다.

문제링크

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

 

반응형

'알고리즘 > 백준' 카테고리의 다른 글

백준 1946 신입 사원  (0) 2020.12.09
백준 4344 평균은 넘겠지 Python  (0) 2020.12.09
백준 20162 간식 파티 Python  (0) 2020.12.08
백준 1149 RGB거리 Python  (0) 2020.12.08
백준 1309 동물원  (0) 2020.12.07
반응형

문제풀이

1. n,k,l을 입력 받습니다.

2. n번 3개의 정수로 구성된 리스트를 입력 받습니다.

3. 입력받은 리스트의 최솟값과 합계를 각각 k와 l과 비교합니다.

4. 입력받은 리스트의 최솟값과 합계가 각각 k와 l보다 크다면 answer에 1을 더하고, vip 리스트에 3명의 기록을 넣습니다.

5. answer를 출력하고, vip에 들어있는 기록들을 출력합니다. 저는 vip 리스트를 스트링으로 변환 후, 맨 앞과 맨 뒤의 대괄호를 지우고, re의 sub함수를 활용하여 ','를 지워 출력하였습니다.

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import sys, re
readline = sys.stdin.readline
def main():
    n,k,l = map(int,readline().split())
    ans = 0
    vip = []
    for _ in range(n):
        records = list(map(int,readline().split()))
        if min(records) >= l and sum(records) >= k :
            ans += 1
            vip += records
    print(ans)
    print(re.sub(',','',str(vip)[1:-1]))
if __name__ == '__main__':
    main()
cs

문제 링크

 

20299번: 3대 측정

첫째 줄에 정수 $N$, $K$, $L$이 주어진다. $N$은 팀의 수, $K$는 팀원 $3$명의 레이팅 합에 대한 클럽 가입 조건, $L$은 개인 레이팅에 대한 클럽 가입 조건이다. ($1 \leq N \leq 500\ 000$, $0 \leq K \leq 12\ 000$, $

www.acmicpc.net

 

반응형

'알고리즘 > 백준' 카테고리의 다른 글

백준 1149 RGB거리 Python  (0) 2020.12.08
백준 1309 동물원  (0) 2020.12.07
백준 11057 오르막 수 Python  (0) 2020.12.03
백준 4358 생태학  (0) 2020.10.21
백준 1520 내리막 길  (0) 2020.10.20

+ Recent posts