소수 판별 시, 제곱근 까지만 찾아도 판별이 가능함.문자열로 바꿔서 슬라이싱 활용
금민수의 개수는 숫자의 자릿수에 의해 결정된다.(ex. 2자리 수 인 경우 44, 47, 74, 77 이고 이는 2 \*\* 2승이다.)collections 모듈의 product함수를 사용하여 입력 값 범위의 모든 경우를 구한다.(✔ product : 중복순열)for문
전위 : root -> left -> right, 중위 : left -> root -> right, 후위 : left -> right -> root출력 순서에 맞게 재귀함수를 호출함
문제 > 풀이 > n >= 3일 경우, dp[n] = dp[n-1] + dp[n-2] 문제의 조건 때문에 결과를 15746으로 나눠줘야 함(안하면 메모리 초과) 코드
우선 주어진 값을 정렬.for문을 돌면서 요소가 length 범위 밖이면, start를 요소로 바꿔주고 결과값에 +1
점수판이 비어있을 경우 1 반환.점수판이 꽉 차있고 점수판의 최솟값이 입력 점수보다 크거나 같으면 -1 반환.그 외에 for문을 돌며 점수판 점수보다 큰 경우 index+1 값을 return, 다 돌면 꼴등이므로 n+1(for - else 구문 이용)
각 국가의 메달 수를 입력 받은 후, sort함수의 key function 사용하여 정렬함.찾고자하는 국가의 index를 찾은 후, 일치하는 결과 값 return
ord 함수를 통한 숫자 / 문자 판별 후, 합을 기존 배열에 추가하여 arr을 다시 만들어줌.sort함수의 key function을 이용함.첫번째 조건(문자열 길이) : len(x0)두번째 조건(숫자인 것만 더한 자릿수 합) : x1세번째 조건(사전 정렬) : x (
permutations 함수를 사용하여 모든 경우의 수를 만들어 냄.for문과 if문을 사용하여 완전 탐색.
주어진 전화번호를 pb 배열에 넣어 줌.pb배열을 오름 차순으로 정렬함.(911, 97625999, 91125426 -> 911, 91125426, 97625999)정렬된 배열에서 어떤 번호의 접두어가 될 수 있는 단어가 어떤 번호 앞에 오게 됨을 알 수 있음.정렬 후
상영이가 이기면 S, 창영이가 이기면 C라고 놓음. 15개까지 직접 구해보니 SCSSCSCSSCSCSS가 나왔고, 5를 주기로 CSCSS가 반복됨을 알 수 있음.
처음 통과한 코드는 pow함수 활용(pow(a, b, c) 는 a \*\* b % c의 결과값을 return)두번째는 분할 정복으로 해결(ex. 2^11 == 2^5 X 2^5 + 1, 2^10 == 2^5 X 2^5)
수의 범위가 굉장히 크고, 갯수도 많기에 dictionary를 활용함.for문을 돌며 숫자가 key에 있으면 값을 1 더하고, 없으면 값을 새로 추가함.문제에서 최댓값을 가진 정수가 여러개면 작은 것을 출력하라고 했기에 sorting 필요.딕셔너리는 따로 sorting
heapq 모듈을 사용함.heapq 모듈은 list를 최소 힙 처럼 다룰 수 있도록 도와줌.0이 입력될 때, list가 비어 있으면 0을 출력하고, 아니면 heap에서 원소를 삭제 후 출력함.그 외의 수가 입력될 시 heap에 추가해줌.
heapq 모듈은 최소 힙만을 지원하므로, 입력값에 -를 붙이면 최대 힙 처럼 사용 가능함.
두 가지 경우를 생각할 수 있음.1) 처음 채널에서 출발하는 경우2) 즐겨찾기 된 채널에서 출발하는 경우1)의 경우에 대한 계산과, 2)에 대한 계산 결과를 res 배열에 넣어줌.min(res)값 출력함.
board 배열을 세로로 돌면서 각 문자의 갯수를 count 함.count한 결과를 dictionary tmp에 저장해 줌.items()함수를 사용하여 key, value를 list형태로 return 받음.문제의 조건대로 갯수는 내림차순, 알파벳은 오름차순으로 정렬함.
방법 : 큰 수를 만날 때 까지 index를 넘기다 큰 수를 만나면 큰 수의 직전 수를 제거함.ex) 1) 4177252841 > 2) 477252841 > 3) 77252841 > 775841문자열로 풀다가 시간초과 나서 스택으로 해결함.1\. alive, dead,
bin 함수를 쓰면 아주 쉬운 문제지만, 정말 못 하는 재귀를 연습하기 위해 재귀로 품.7을 예시로 들고 과정을 적어보면 다음과 같음.binary(7) 호출 -> binary(3) 호출 -> binary(1) 호출 -> 1 // 2 == 0 이므로 호출 끝.binary
heapq 모듈에 tuple을 넣으면, tuple의 첫번째 값으로 연산을 함.1.을 이용하여 tuple에 (절댒값, 원래 값)을 대입하여 heap 연산 수행함.
combinations 모듈을 이용하여 가능 한 모든 경우의 수 탐색함.출력을 문자열로 바꿔주기 위해 join 함수 사용.
2칸씩 넘어갈 때 for문의 step 기능을 이용했고, 내림차순으로 sort하여 2번째로 큰 값을 찾음.
합 연산 후 비교를 기존 카드 뭉치끼리 하는 것이 아니라, 카드 뭉치를 합친 것들과도 비교를 해야함.두개의 카드뭉치를 heappop 후, 합을 한 결과를 다시 heappush 하여 더 이상 비교를 할 수 없을 때 까지 연산을 진행함.카드 뭉치가 1개인 경우, 비교를 진
count함수와 2중 for문을 이용하여 문제의 조건대로 구현함.크기 비교와 사전 순 비교를 동시에 하기 위해 tuple과 sort함수를 이용함.
호텔의 방 배정은 i라인 객실을 전부 채운 후, i+1을 채우는 방식으로 진행 됨.층수는 사람 수(p) % 층(h)로 계산하면 되지만, p == h인 경우에 0이 나오는 오류가 생김.위 경우를 해결하기 위해 p % h == 0 일 경우, h = n으로 바꿔줌. 호수는
알파벳으로 주어진 숫자를 바꿔주기 위해, for문과 dictionary를 활용함.연산자가 아닌 문자를 만나면, stack에 집어넣어 줌.연산자를 만나면, 2개의 수를 pop한 후, 연산의 결과를 다시 stack에 넣어줌.(뺄셈, 나눗셈의 경우 순서에 유의해야 함.)연산
while문을 돌며 a가 0이 될 때 까지 나머지에 해당하는 index값을 std에서 찾아 res에 append한 후 print함.
값이 1이고 크기가 n인 dp 배열을 선언함.dp에 자신을 포함하여 만들 수 있는 부분 수열의 크기를 저장함.for문을 돌며 현재 값(i)이 이전 값(j)보다 큰지 확인 함.큰 경우, dp값에 1을 더해주고, 마지막에 dp배열의 최댓값을 print해 줌.
배열을 크기순으로 정렬 함.두개의 포인터를 양 끝에 두고 시작하고, 좌측 포인터 < 우측 포인터될 때까지 while문을 실행함.각각의 pointer가 가리킨 값에 따라 3가지 경우로 나뉨. 1) 같을 경우 : 결과에 1을 추가한 후, 좌측 포인터는 +1, 좌측 포
for문을 돌며 기준점을 늘려가며 팰린드롬인지 확인 후, 팰린드롬일 시 길이 값을 출력함.(기준점까지의 slicling한 문자열을 뒤에 뒤집어서 붙여 줌.)
두번째 링 부터 for문을 돌면서, 첫번째 링 과의 최대공약수를 구하고, 이를 각각 나눠 준 값을 출력함.
주어진 입력을 list로 변환 함.문제의 조건대로 진행해주면서, 기존 n과 같아질 때 까지 while문을 돌며 같아질 시 return함.
첫 문자를 기준 문자로 따로 입력받음.그 후 나머지 문자열을 for문을 돌며 입력받으면서 기준 문자열과 비교 후, 다를 시 기준 문자열을 '?'로 대체함.
문제 > 풀이 > 코드
파이썬에서 제공하는 set의 연산 기능을 이용함.
while문을 이용하여 1부터 시작함.for문으로 배열의 모든 원소로 나눠주고, 나눠 떨어지는 경우가 3번 나타나면 reutrn함.아닐 시 count를 초기화 하고 수를 늘려줘서 반복함.
모르겠어서 풀이 봄.1\. 한개의 heap으로는 해결이 나지 않으므로 최대 / 최소 heap을 따로 선언해서 사용함.2\. check란 확인용 배열을 만든 후, heap에 push할 때 index값을 같이 넣어면서 checkindex를 True로 변경 함.3\. hea
구간 합을 구하는 방식을 단순히 할 때마다 slice 해주면 time out남.그래서 for문을 돌며 0, 1, 2, 3 -> 1, 2, 3, 4의 합을 구할 때, 기존 0, 1, 2, 3에 0을 빼주고 4를 더해주는 방식으로 계산함.각 구간 합을 res배열에 추가 후
문제 > 풀이 > permutations를 통해 모든 연산자의 조합을 구함. for문을 돌며 각 연산자의 조합에 대해서, enumerate함수를 사용하여 하나씩 계산 후 결과를 저장하는 res배열에 넣어줌. res배열의 max, min값을 각각 print 함. 코드
에라토스테네스의 체를 사용하여 주어진 수의 최댓값 까지 소수를 전부 구해놓음.주어진 배열에서 for문을 돌며 소수인 것들 만 res배열에 넣어줌.res배열이 비어있을 경우 소수가 없단 뜻이므로 -1 print함.아닐 경우 res배열에 for문을 돌며 최소공배수를 구해줌
popleft를 사용하기 위해 주어진 배열을 deque로 변환함.while문을 돌며, 카드가 1장 남을 때 까지 popleft 해준 후 마지막 값 return함.
시간의 최소가 되려면 앞쪽에 최대한 많은 사람을 넣어야 하므로 걸리는 시간을 오름차순으로 정렬해야 함.sort함수를 이용해 오름차순으로 정렬한 후, for문을 돌면서 시간의 누적합을 구해준 후, 누적 합 출력함.
문제 > 풀이 > 코드
zfill함수를 사용하여 자릿수를 채워주는 0을 유지함.while문을 사용하여 조건에 맞게 구현함.
for문을 돌며 각 문자에 대해 ord함수를 사용함.ord함수의 변환값의 범위를 기준으로 대, 소문자, 숫자를 나눠줌.13민 변환값이 각 문자의 최대 범위를 초과하면, -13해줘서 맞춰줌.
for문을 사용하여 m길이 이상인 단어들만 words배열에 넣어줌.Counter의 most_common함수를 사용하여 빈도순으로 정렬된 list인 res를 return받음.res배열을 sort함수의 key와 lambda식을 활용하여 문제의 조건에 맞게 설정해준 후 정렬
각 점들의 거리의 합을 최소로 하기 위해서는, 주어진 점들을 x, y에 대해 각각 정렬 후 그 중간값을 취하면 됨.sort함수와 lambda식을 사용하여 x,y에 대해 각각 정렬 후, 그 중간값을 mid_x, mid_y에 저장함.문제에서 주어진 거리 구하는 식 대로 계
오래걸리는 나무부터 심기위해 내림차순으로 sort함.for문을 돌며 묘목이 자라는 시간인 trees에 묘목을 심는데 걸리는 시간을 더함.max값을 구한 후, 다음날에 불러야하므로 +1 해서 print함.
2개의 stack과 switch란 bool 변수를 사용함.꺽쇠로 둘러싸인 부분은 그대로 유지되고, 아닌 부분은 뒤집어줘야 하기 때문에 stack1엔 정순, stack2엔 역순으로 넣어야 할 값을 넣어줌.switch가 True면 정순, False면 역순을 의미함.여는 꺽
입력된 키워드 값을 board dictionary에 저장함.쓴 글을 입력받아 split함수를 통해 나눠주고, for문을 돌며 keys함수를 사용하여 board에 있는 경우 값을 줄인 후 전체 키워드 값에서 -1해줌.
split함수를 사용하여 울음 소리의 입력을 sounds 배열로 변환함.질문이 주어지기 전까지 동물 별 울음 소리를 animals 배열에 넣어줌.질문이 주어지면, for문을 돌며 sounds에서 animals에 존재여부를 확인 후, 존재 시 값을 없앰.sounds에서
\*을 기준으로 패턴을 나눠줌.앞 패턴부터 패턴의 길이가 전체 문자길이보다 길거나 같지 않을 경우 NE print함.같을 경우, 해당 문자열을 공백으로 바꿔줘서 뒷 패턴 비교 시 중복을 막음.뒷 패턴도 2번 방식과 동일하게 진행함.
문자열의 순서를 유지하면서 절반을 날려야하기 때문에, 0은 앞에서부터 제거하고 1은 뒤에서 부터 제거해줌.총 제거 횟수는 count 함수를 통해 찾아냈으며, pop(index)를 활용하여 해당 자리의 숫자를 제거함.
문제의 조건이 굉장히 많기 때문에 색깔 별, 숫자 별로 구별해서 생각함.Counter 함수를 통해 색깔의 동일 여부를 파악함.숫자의 동일 여부 또한 Counter 함수를 사용한 후, items 함수를 사용하고 items가 return한 값을 sort함수와 lambda식