본문 바로가기

Algorithm

(140)
시각 문제 정수 N에 대하여 00시00분00초부터 N시59분59초까지 모든 시각에 3을 포함하는 경우의 수 유형파악 가능한 모든 경우의 수를 탐색 -> (Implementaion - 완전탐색) 코드 # 완전탐색으로 해결해도 됨. for i in range(n+1): for j in range(60): for k in range(60): if '3' in str(i) + str(j) + str(k): count += 1 n = 1 count = 0 for i in range(0, n): if '3' in str(i): count += 1 print((15*60+45*15)*(n-count+1)+3600*count) 완전탐색으로 구현시 시간복잡도 O(N) 최대 24*60*60
상하좌우 문제 N행 N열에서 (1, 1)부터 시작해 조건에 따라 움직일 때, 결과는? 조건 : L or R or U or D 유형 일련의 명령에 따라서 개체를 차례대로 이동시킨다는 점에서 '구현-시뮬레이션' 알고리즘 n = 5 start = [1, 1] direction = ['R', 'R', 'R', 'U', 'D', 'D'] dx = [-1, 0, 1, 0] dy = [0, -1, 0, 1] dtype = ['U', 'L', 'D', 'R'] for i in direction: for j in range(4): if i == dtype[j]: x_pos = start[0] + dx[j] y_pos = start[1] + dy[j] if 1
Implementation - Concept 해당 문제는 "이것이 코딩 테스트이다" 책을 참고하여 제작하였습니다. 구현 "풀이를 떠올리는 것은 쉽지만 소스코드로 옮기기 어려운 문제" 구현 하기 어려운 문제 유형 - "알고리즘은 간단한데 코드가 지나칠만큼 길어지는 문제" - "특정 소수점 자리까지 출력해야하는 문제" - "문자열이 입력으로 주어졌을 때 한 문자 단위로 끊어서 리스트에 넣어야하는 문제" -> 사소한 조건 설정이 많은 문제 -> "문제 길이가 길다" 유형 완전 탐색 : 모든 경우의 수를 주저없이 다 계산하는 해결 방법 -> 가능한 모든 경우의 수를 모두 검사해보는 방법 시뮬레이션 : 문제에서 제시한 알고리즘을 한 단계씩 차례대로 직접 수행 -> 일련의 명령에 따라서 개체를 이동시킨다. (+) 파이썬에서의 메모리 사용량 리스트의 길이(in..
볼링공 고르기 문제 N개의 볼링공을 같은 무게라도 번호가 다르면 서로 다른 공으로 간주할 때, 두 사람이 서로 다른 무게의 볼링공을 고를 수 있는 모든 경우의 수를 구하라. 아이디어 1. for, for 해서 모든 순열을 구한다. 2. 조합 - 같은 번호를 가진 볼링공 수 3. 기록을 통한 체크 입력 (1, 3, 2, 3, 2) - 출력 8 번호 : (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 5), (3, 4), (4, 5) 무게 : (1, 3), (1, 2), (1, 3), (1, 2), (3, 2), (3, 2), (2, 3), (3, 2) - 볼링공의 조합을 생각해보면 결과적으로는 번호가 다르고 무게가 달라야한다. - 1. 번호를 고려해서 생각해보면 for 문 이외에는 생각이 ..
만들 수 없는 금액 문제 N개의 동전을 사용해 만들 수 없는 양의 정수 금액 중 최솟값을 구하는 프로그램 유형 분석 최솟값을 구하며 딱히 다른 알고리즘이 생각나지 않는다. 아이디어 주어진 숫자리스트를 작은 순서대로부터 확인을 하면서 만들 수 있는 금액 체크 여부를 1부터 시작해서 차근차근 가능한지 확인한다. 과정은 다음과 같다. 1원을 만들 수 있는가? -> 1원이 있어야만 한다. -> 없다면 종료, 있다면 현재 만들 수 있는 최대 금액은 1원디다. 2원을 만들 수 있는가? -> 1원 또는 2원이 있어야만 한다. -> 없다면 종료, 있다면 현재 만들 수 있는 최대 금액은 3원, 4원디다. ... 이런식의 아이디어를 갖는다. 예를 들어, [1, 1, 4, 5, 6] 작은거 부터 확인해보면, 1원으로 1원까지 만들 수 있다. ..
문자열 뒤집기 문제 0, 1로만 이루어진 문자열을 뒤집어 모든 숫자를 같게 만들어야한다. 연속된 하나 이상의 숫자를 뒤집을 수 있다. 1->0 or 0->1 이 때, 최소한으로 뒤집어 모두 같은 문자열을 만들어라. 유형파악 "최소한"이라는 말이 나왔기에 합리적으로 그리디 알고리즘을 의심한다. 아이디어 "결과는 항상 00000 처럼 0으로만 이루어져 있거나 11111 처럼 1로만 이루어진다." 0001001010101110 가 있다고 가정할때, 모두 1로 만들기 위해서는 6번 뒤집는다. 모두 0으로 만들기 위해서는 5번 뒤집는다. 그냥 머리속에 있는 것을 만들어보려고 한다. 결과는 항상 1로만 이루어져 있거나 0으로 이루어질 것이다. 1개 이상의 연속된 0의 수와 1의 수를 구하여 더 작은 집합의 수를 출력한다. 정당성..
곱하기 혹은 더하기 문제 0에서 9로 이루어진 문자열이 있을 때, 순서대로 곱하거나 더하여 만들 수 있는 가장 큰 수를 구하라 유형파악 가장 큰 이라는 말이 나왔고 딱히 자료구조를 사용해야할 상황이거나 게임을 만드는 것과 같은 상황이거나 정렬 상황이거나 시간 복잡도를 크게 고려해야하는 상황이 아니라면 그냥 그리디 알고리즘이지 않나 싶다. 아이디어, 정당성 우선, 가장 먼저 드는 생각은 곱하기를 많이 해야 큰 수를 만들 수 있다. 하지만 항상 그런 것은 아니고 0에 곱하기를 하면 안된다. 또한 1은 더하는게 더 큰 수를 만들 수 있다. 예를 0123456이 있을때 0+1 = 1 1+2 = 3 3*3 = 9 이런식으로 곱하기만 하면 안된다. 구현 피연산자 중 0이나 1이 있는지 체크해가며 연산을 진행하되 0, 1 이 아니면 곱..
모험가 길드 문제 공포도가 X인 모험가는 반드시 X명 이상의 길드원이 필요하다. 예를 들어, 한 모험가의 공포도가 3이면 그 사람은 3명 이상의 길드에 들어간다. 모험가들의 수, 각각의 공포도가 주어질 때, 만들 수 있는 길드의 최대 수를 구하라 (단, 모든 모험가가 길드에 속할 필요는 없다.) 유형 파악 그리디 문제들은 최소한의, 최대한의, 가장 큰, 가장 작은 등의 단어가 들어간다. 이런 단어가 나온다면 항상 그리디는 아니지만 그리디를 먼저 의심하는 습관이 필요하다. 아이디어 및 정당성 만약, 공포도가 2 3 1 2 2이라고 가정하자 이 때, 정렬하면 1 2 2 2 3 이다. 1은 혼자서도 그룹이 가능하다. 2는 둘 이상의 사람이 필요하다, 3은 세명 이상의 사람이 필요하다. "공포도가 적은 사람일 수록 많은 팀..