목록자료 구조 (9)
홍우진의 개발 일기장
문제 링크 https://www.acmicpc.net/problem/9375 풀이 코드t = int(input())for _ in range(t): n = int(input()) wear = {} for i in range(n): a,b = input().split() #값을 이름과 종류로 나눈다. if b not in wear: #종류가 딕셔너리에 없다면 wear[b] = 1 #종류를 추가한다. else: #만약 있다면 키값을 1 더한다. wear[b] += 1 a = 1 for i in wear: a *= wear[i]+1 #(x 개수 + 1) * (y ..
문제 링크https://www.acmicpc.net/problem/18870풀이 코드n = int(input())x = list(map(int,input().split()))num = list(set(x)) #중복 제거num.sort()d = {}for i in range(len(num)): d[num[i]] = i # {-10: 0, -9: 1, 2: 2, 4: 3}for i in x: print(d[i], end=' ')코드 해석우선 좌표 압축이란 좌표를 보기 쉽게 크기순으로 출력해 주는 것이다.예시를 들자면 [3, -1, 100]을 [1, 0, 2]로 바꾸는 것이다. 먼저 set을 사용하여 중복을 지워주고 다시 list로 바꿔준다. 그 후 정렬해 주고 딕셔너리를 사용하여 좌표에 순서를 ..
문제 링크https://www.acmicpc.net/problem/25192 풀이 코드name = {}n = int(input())sum = 0for i in range(n): inp = input() if inp == "ENTER": name.clear() elif inp not in name: name.add(inp) sum += 1print(sum)코드 해석set 데이터타입을 이용한다.왜 list 말고 set을 이용하냐??이유는 내부적인 데이터 구조와 탐색 알고리즘의 차이 때문에 시간 차이가 발생하기 때문이다.쉽게말하면 set이 시간이 더 짧게 걸린다. 값을 받은 뒤 값이 ENTER이라면 name을 비워주고만약 아니면서 name에 이름이 없다면 ..
문제 링크https://www.acmicpc.net/problem/1874 풀이 코드cnt = 1result = Truestack = []dap = []n = int(input())for i in range(n): num = int(input()) while cnt 코드 해석복잡한 난이도였다.핵심은 cnt다. cnt가 stack을 쌓아주고 만들때마다 +를 답에 집어넣고, cnt + 1 을 해준다.stack을 쌓다가 만약 stack에 들어간 수가 사용자가 넣은 수(num)랑 똑같다면 stack의 제일 끝 수를 빼고 답에 -를 집어넣는다.만약 동일하지 않다면 수열 생성이 불가능하다는 뜻이다. 따라서 NO를 출력하고 끝낸다.
문제 링크 https://www.acmicpc.net/problem/2161 2161번: 카드1 N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가 www.acmicpc.net 풀이 코드 n = int(input()) a = [] card = [i for i in range(1, n + 1)] while len(card) != 1: a.append(card.pop(0)) card.append(card.pop(0)) for j in a: print(j, end=' ') print(card[0]) 코드 해석 카드 배열을 만든 뒤 앞카드를 버리고 두번쨰 카드를 뒤에..
문제 링크 https://www.acmicpc.net/problem/1417 1417번: 국회의원 선거 첫째 줄에 후보의 수 N이 주어진다. 둘째 줄부터 차례대로 기호 1번을 찍으려고 하는 사람의 수, 기호 2번을 찍으려고 하는 수, 이렇게 총 N개의 줄에 걸쳐 입력이 들어온다. N은 50보다 작거나 같 www.acmicpc.net 풀이 코드 n = int(input()) one = int(input()) vote = [] count = 0 for _ in range(n - 1): vote.append(int(input())) vote.sort(reverse=True) if n == 1: print(0) else: while vote[0] >= one: one += 1 vote[0] -= 1 count ..
문제 링크 https://www.acmicpc.net/problem/5568 풀이 코드 from itertools import permutations n, k = int(input()), int(input()) cards = [input().rstrip() for _ in range(n)] res = set() for per in permutations(cards, k): res.add(''.join(per)) print(len(res)) 코드 해석 순열을 이용하여 풀면 되는데 permutations() 를 사용하면 순열을 쉽게 구할 수 있다.
문제 링크 https://www.acmicpc.net/problem/7785 7785번: 회사에 있는 사람 첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는 www.acmicpc.net 풀이 코드 import sys input = sys.stdin.readline n = int(input()) s = dict() for i in range(n): a, b = map(str, input().split()) if b == "enter": s[a] = 1 else: del s[a] s = sorted(s.keys(), reverse=T..