목록Algorithm (111)
Sunrise
자료 구조 문제입니다. - 1부터 n까지 순열을 만듭니다. - 원을 도는 주기 num을 선언합니다. - 주기 num에 K-1을 더해가면서 주기 num에 따라 사람을 제거합니다. - 만약 남아있는 사람 수보다 주기 num이 크거나 같을 때, 주기는 남아있는 사람 수로 나눈 나머지입니다. (3명 중에서 5번째 사람은? → 5%3= 2, 두번째 사람) (크거나 같아야 하는 이유 → 4 >= 4 (0, 1, 2, 3) 길이 4인 순열은 3번째 인덱스까지 있어서 인덱스 num은 4 그대로 가면 인덱스 에러, 나머지 처리되어야 함) N, K = map(int, input().split()) n_list = [i for i in range(1, N+1)] y_list = [] num = 0 for i in range..

이분 탐색, 해쉬, 카운트 문제입니다. 10815 문제와 비슷하지만 N에 중복된 수가 주어지는 점이 다릅니다. 단순하게 m_list에 담긴 요소를 n_list에서 count하는 방법이 떠오르지만, count는 시간복잡도 O(N) 함수로 M, N 범위를 보면 시간 초과가 날 것을 예상할 수 있습니다. 시간복잡도를 줄이기 위해 set 자료형을 사용하면 중복된 숫자 정보가 사라지므로 사용하지 않습니다. 세 가지 풀이 방법이 있습니다. 1. 이분 탐색으로 count할 범위를 줄여서 시간복잡도를 O(N) → O(log₂N)으로 줄이는 것 2. 해쉬 맵을 이용하여 숫자-갯수를 구하고 시간복잡도를 O(N) → O(1)으로 줄이는 것 3. 리스트 요소를 count 해주는 Counter 모듈을 사용합니다. 첫 번째, 이..
정렬 문제입니다. - 숫자들을 num_list에 받습니다. - set으로 중복 제거하고 오름차순 정렬합니다. import sys input = sys.stdin.readline N = int(input()) num_list = list(map(int, input().split())) num_list = sorted(set(num_list)) for x in num_list: print(x, end=' ') # print(' '.join(num_list)) # str로 숫자 받으면 join 가능한데 문제에서는 정수이므로 int만 정답 처리
정렬 문제입니다. 좌표의 x 오름차순, y 오름차순 정렬이 필요하므로 파이썬 기본 제공 함수 sort를 사용합니다. 파이썬 기본 함수 sort( __iterable, key, reverse) → sort 의 key 옵션에 지정된 함수의 결과에 따라 정렬됩니다. sort key 기본값은 가나다 순, 알파벳 순, 오름차순입니다. - xy_list에 좌표를 list 형식으로 묶어서 받습니다. - sort key를 람다함수 x로 해서 x[0], x[1] 기준으로 정렬합니다. (sort 기본값과 정렬 기준은 같음) - xy_list 요소를 모두 출력합니다. (출력 시 * (iterable 풀기) 사용 가능) import sys input = sys.stdin.readline N = int(input()) xy_l..
정렬 문제입니다. 단어의 알파벳 순 정렬, 단어 중복 제거, 단어 길이 순 정렬이 필요하므로 파이썬 기본 제공 함수 sort를 사용합니다. 파이썬 기본 함수 sort( __iterable, key, reverse) → sort 의 key 옵션에 지정된 함수의 결과에 따라 정렬됩니다. sort key 기본값은 가나다 순, 알파벳 순, 오름차순입니다. 문제를 풀어보자면, - 먼저, 단어를 word_list에 받습니다. - word_list 를 set 변환하여 중복 제거하고, sort합니다. - 다음 sort key를 len으로 하여 한번 더 sort합니다. - 출력 import sys input = sys.stdin.readline N = int(input()) word_list = [] for _ in r..
구현 문제입니다. A[i] * B[i] 합을 최소로 만들기 위해서는 A의 최솟값, B의 최댓값을 찾으면 됩니다. min(A), max(B)를 이용하고 다음 최소, 최대를 찾기 위해 pop(index)를 이용합니다. N = int(input()) A = list(map(int, input().split())) B = list(map(int, input().split())) S = 0 for i in range(N): S += min(A) * max(B) A.pop(A.index(min(A))) B.pop(B.index(max(B))) print(S)
스택 문제입니다. 처음에 해결법을 문자열을 받은 후에 insert, remove 정도로 생각했지만 파이썬 insert는 list 처음부터 훑고가면서 시간복잡도는 O(N)으로 시간 초과 됩니다. 문제에서 시간 제한을 0.3초로 짧게 한걸 보니 다른 풀이가 필요하다고 볼 수 있습니다. - 다른 풀이를 생각해보면, 두 개의 스택에서 append, pop을 이용한 방법이 있습니다. 커서의 왼쪽을 l_stack, 커서의 오른쪽을 r_stack으로 두면 커서 이동, 문자 추가/삭제가 간단해집니다. 커서가 문장의 맨 앞 / 맨 뒤인 경우는 l_stack / r_stack 이 비어있는 경우로 if문을 사용하여 처리할 수 있습니다. - 명령어 실행 시 딕셔너리를 이용해서 미리 선언한 명령어 함수들을 호출할 수 있습니다...
인코딩 / 디코딩 문제입니다. 파이썬 base64 라이브러리를 알고 있으면 쉽게 풀 수 있지만, 이를 알지 못해도 문자열을 잘 조작하면 문제를 풀 수 있습니다. 먼저 첫 번째, 라이브러리 없이 문자열 조작으로 푸는 방법입니다. - 입력 받은 word를 이진 데이터로 변환하기 위해 변환표 decode를 이용해서 숫자 num을 뽑아옵니다. - num을 이진수로 변환하고 6칸씩 맞춰서 bin_data에 저장합니다. - 완성된 bin_data를 8칸씩 나누어 십진수로 변환합니다. - 십진수를 ascⅡ 코드에 맞게 다시 변환하여 answer을 완성시킵니다. T = int(input()) decode = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','..
구현 문제입니다. buildings 리스트를 받고 i 기준으로 2칸 떨어진 곳보다 i 요소가 크면, i 요소에서 주변 요소들중 가장 큰 값을 빼서 전망권이 확보된 층을 구합니다. 2~n-2 범위에서 전망권이 확보된 층을 모두 더하면 답을 구할 수 있습니다. T = 10 for test_case in range(1, T+1): n = int(input()) count = 0 buildings = list(map(int, input().split())) for i in range(2, n-2): if buildings[i] > buildings[i-2] and buildings[i] > buildings[i-1] and buildings[i] > buildings[i+1] and buildings[i] > ..
구현 문제입니다. 받은 N까지 i를 올려가면서 문자열로 바꿔 안에 '3', '6', '9'가 있는지 확인합니다. 있다면 있는 횟수를 count('요소')로 구해서 총 횟수를 더해주고, 그 횟수만큼 '-' 붙여서 출력, 마무리는 ' ' 없다면 그대로 i 출력, 마무리는 ' ' N = int(input()) for i in range(1, N+1): count = 0 j = str(i) if '3' in j or '6' in j or '9' in j: count += j.count("3") + j.count("6") + j.count("9") for _ in range(count): print('-', end='') print(' ', end='') else: print(i, end=' ')