목록Algorithm (111)
Sunrise
집합과 맵 문제입니다. 듣도 못한 단어 & 보도 못한 단어 들을 받고 둘 다 속해 있는 듣도보도 못한 단어를 구하는 문제입니다. 단어들에 중복이 없고, 교집합을 구해야 하기 때문에 set 자료형을 활용합니다. set에 추가하기 위해서는 add 메소드 사용 사전 순으로 출력해야 하니 list 변환 후 sorted 사용 import sys input = sys.stdin.readline N, M = map(int, input().split()) n_arr = set() m_arr = set() cnt = 0 for _ in range(N): n_arr.add(input().rstrip()) for _ in range(M): m_arr.add(input().rstrip()) answer = sorted(lis..
집합과 맵 문제입니다. 먼저 M, N을 받습니다. M개의 포켓몬 이름들을 번호 순으로 사전에 등록합니다. 이때, 번호, 이름으로 둘 다 검색할 수 있게 둘 다 등록합니다. N개의 질문을 받습니다. q를 일단 문자열로 받고, 문자열이 숫자로만 이루어져있는지 확인하는 함수 isdigit()을 사용합니다. import sys input = sys.stdin.readline M, N = map(int, input().split()) p_dict = {} for i in range(1, M+1): a = input().rstrip() # 문자열 \n 제거 p_dict[i] = a # 둘다 저장하면 된다! p_dict[a] = i for _ in range(N): q = input().rstrip() if q.is..
집합과 맵 문제입니다. N 리스트와 M 리스트에 문자열들을 각각 받습니다. M 리스트의 모든 원소에 대해 if ~ in ~ 을 쓸건데, N 리스트에 있다는 것만 확인 하면 되므로 N은 set으로 변환시킵니다 if in -> cnt 1 증가로 답을 구합니다. import sys input = sys.stdin.readline N, M = map(int, input().split()) n_list = [] m_list = [] cnt = 0 for _ in range(N): n_list.append(input()) n_list = set(n_list) for _ in range(M): m_list.append(input()) for m in m_list: if m in n_list: cnt += 1 prin..
정렬 문제입니다. 들어온 숫자들의 순서를 0부터 정하고 그 순서를 출력해주면 됩니다. 먼저 set으로 중복제거하고 sort해서 순서 리스트를 만듭니다. 이때 받은 숫자 리스트 nums에 대해 index 메소드를 사용하게 되면, 최대 100만개의 N에 대해 순서를 찾느라 계속 리스트를 탐색해야하므로 index 접근 방식은 시간초과가 나게 됩니다. (순서를 통해 접근하므로 시간복잡도 O(N)) 따라서 index 접근 대신에 딕셔너리에 값-순서 쌍을 저장하는 방법을 택합니다. (키를 통해 접근하므로 시간복잡도 O(1)) 딕셔너리에 값-순서 쌍 저장한 후, 받은 숫자 nums의 모든 x에 대해 dic[x] 출력 (x 키의 값) ''' 1. 들어온 숫자 set 으로 중복 제거하고 순서 리스트 만들기 2. 모든 x..
정렬 문제입니다. 먼저 들어오는 age, name을 리스트에 담습니다. 담은 후에 age 기준으로만 정렬해야 하므로, sort에서 key를 age로 잡습니다. 이를 stable 정렬 이라고 합니다. import sys input = sys.stdin.readline N = int(input()) member_list = [] for test_case in range(N): age, name = map(str, input().split()) member_list.append((int(age), name)) member_list.sort(key=lambda x: x[0]) # stable 정렬 - key 기준만 정렬, 나머지 순서 유지 for i in member_list: print(i[0], i[1])
정렬 문제입니다. 숫자를 받고 그 숫자에 대한 자리수를 구해서 리스트에 넣어줍니다. 역정렬 한뒤 형식에 맞게 출력합니다. N = int(input()) nums = [] while(1): if N == 0: break else: nums.append(N % 10) N //= 10 nums.sort(reverse=True) for x in nums: print(x, end='')
정렬 문제입니다. N개의 숫자들을 받아 산술평균, 중앙값, 최빈값, 범위를 구해야합니다. 먼저, 중앙값, 최빈값을 편하게 구하기 위해, 받은 숫자들을 리스트에 넣고 파이썬 내장함수 sort 로 정렬해줍니다. (시간복잡도 log₂N) 1. 산술평균을 구하고 첫째 자리에서 반올림해야하므로 round 함수 사용합니다. round(number, 몇째자리(없으면 첫째자리)) 2. 중앙값은 숫자를 정렬했으므로 N//2 인덱스의 값입니다. (N이 홀수) 3. 최빈값은 리스트에 숫자 1개가 들어온 경우를 따로 처리해주고, 숫자 2개 이상 들어온 경우에는 Counter 모듈의 most_common 메소드를 이용해 최빈값이 2개 이상인지 확인합니다. 2개 이상이면 정렬되어 있으므로 2번째로 작은 최빈값을 구할 수 있고, ..
브루트 포스 문제입니다. 666, 1666, 2666 ... 6661 6662 .. 규칙이 복잡해서 전수조사 방법으로 접근합니다. 낮은 숫자들부터 찾아야하므로 while문에서 num을 1씩 증가시키면서 찾습니다. 666 이 통째로 들어간 숫자를 찾기 위해서는 문자열 처리를 하고 if ~ in ~ 으로 찾습니다. N번째 작은 숫자를 찾아야 하므로 찾은 숫자를 nums 리스트에 넣다가 길이 N이 되면 break 합니다. 답은 가장 마지막에 들어온 숫자 nums[-1] 입니다. N = int(input()) nums = [] num = 0 while(1): num += 1 if '666' in str(num): nums.append(num) if len(nums) == N: break print(nums[-1])
브루트 포스 문제입니다. 먼저 체스판 맵을 입력받습니다. 입력받은 체스판 맵에서 8*8 공간을 전수조사할건데, 탐색 가능한 공간까지 범위를 정해서 이중 for문을 돌립니다. 한 8*8 공간에 대해서 다시 전수조사를 할건데, 'W'로 시작하는게 나은 경우와 'B'로 시작하는게 나은 경우를 생각해서 cnt1, cnt2를 정의합니다. 'W'로 시작했을 때 바뀌는 타일수 cnt1과 'B'로 시작했을 때 바뀌는 타일 수 cnt2를 최솟값 리스트에 넣고, 최솟값 리스트 중에서 가장 작게 나온 값을 구하면 답이 됩니다. N, M = map(int, input().split()) chess_map = [] mini = [] for _ in range(N): chess_map.append(input()) for row ..
브루트 포스 문제입니다. 먼저 people 리스트를 정의하고 몸무게, 키 쌍을 모두 받아 넣습니다. 그리고 담긴 쌍에 대해, 모든 쌍과 비교를 해야 하므로 이중 for문을 사용하고, rank 1에서 시작해 몸무게, 키가 모두 작은 경우에만 1씩 더해줍니다. N = int(input()) people = [] for test_case in range(N): x, y = map(int, input().split()) people.append([x, y]) for x in people: rank = 1 for y in people: if x[0] < y[0] and x[1] < y[1]: # 같은 부분은 패스, 다음 y 부터 비교하면서 +1 rank += 1 print(rank, end=' ')