목록프로그래머스/2단계 (12)
연습장

// f(n) = f(n-1) + f(n-2) // 피보나치 수열 점화식function solution(n) { let answer = 0; let temp = [1,2] if(n == 1){ return temp[0] } else if(n == 2){ return temp[1] } else { for(let i = 3; i n ; i++ ){ answer = (temp[0] + temp[1]) % 1234567 temp[0] = temp[1] temp[1] = answer } } return answer} 특이한점 숫자가 너무 커..

CONV(100, 10, 2) 10진수의 100을 2진수로 표기하는 함수 select A.ID as ID, CONV(A.GENOTYPE,10,2) , CONV(B.GENOTYPE,10,2) from ECOLI_DATA A left join ECOLI_DATA B on A.PARENT_ID = B.ID order by A.ID ; A 가 B의 형질을 모두가지는걸 어떻게 비교해야될지 고민해 봤는데 반복문을 써야하나..? 형질을 가지고있다는건 1이라는뜻이고 둘다 같은 형질을 가진다는 의미는 같은 위치에 1이 존재한다는거니까 두개를 그냥 뺴봤다. 다음과 같이 부모의 형질을 모두 가지는 경우 1 과 0 으로만 표기되고 문자열의 길이(자릿수)도 변화가 없는것을 알 수 있다. 예외 상황 자식 : 110부모 ..

점프 k 칸 : 배터리 k 소모순간이동 : 배터리 소모 x 5000 의 경우 2500 에서 순간이동 한 결과와 같음 .. 배터리 소모 x 2500 의 경우 1250 에서 순간이동 한 결과와 같음.. 배터리 소모 x 1250 의 경우 625 에서 순간이동한 결과와 같음 .. 배터리 소모 x 625 의 경우 624 에서 1칸 점프 한 결과와 같음 .. 배터리 소모 15000 -> 2500 -> 1250 -> 625 -> 624 -> 312 -> 156 -> 78 -> 39 -> 38 -> 19 -> 18 -> 9 -> 8 -> 4 -> 2 -> 1 -> 0 다음과 같이 총 5번의 점프가 필요하게 되며 result 도 5가 나오게 된다. 즉 n 이 짝수라면 2 로 나누고 , 홀수라면 1을 빼며 resul..
반복문 2중으로 사용 def solution(s): answer = 0 while len(s) > 0: count = 0 for i in range(len(s)-1): if s[i] == s[i+1]: s = s[:i] + s[i+2:] count += 1 break if count == 0: break if len(s) == 0 : answer = 1 return answer 시간초과 text 라는 변수에 하나씩 넣으면서 맨 뒤에 값가지고 비교def solu..

b = 10 , y = 2 결국 전체 합하면 12개 이고 이는 4*3 ( 가로가 더 길다) 로 볼 수 있음 8 , 1 => 8+1 = 3*3 24,24 => 24+24 => 8*6 ... ? 반례 18,6 / 16,8 모두 합이 24 가 되며 이는 6*4 , 8*3 등 다양한 경우가 나올 수 있다. 따라서 노란색의 배치를 먼저 고려하고 => 4*2거기서 상하좌우가 1씩 확장된 크기 => (4+1+1)*(2+1+1) 가 전체 갯수 16+8 과 같은지 확인 def solution(brown, yellow): answer = [] for i in range(1,yellow+1): # yellow의 크기 확인 if yellow % i == 0..

n 번째 피보나치 수 가 뭔지 구하는 문제 0번째부터 .. 0 1 1 2 3 5 8 13 ... def solution(n): num0 = 0 num1 = 1 # 임시저장 tmp = 0 # 반복횟수 for i in range(n-1): tmp = num1 num1 = num0 + num1 num0 = tmp return num1%1234567 문제에서 1234567 의 나머지를 구하라고 하여서 다음과 같이 진행위와 같이 하지 않을경우 런타임 에러가 발생함 .. 자릿수가 너무 길어져서 일까 ..

2진법 기준 1의 갯수가 같으면서 , 해당 숫자보다 큰 숫자중, 가장 작은 숫자를 구하는 문제 78 : 1001110 // 4개79 : 1001111 // 5개80 : 1010000 // 2개81 : 1010001 // 3개82 : 1010010 // 3개83 : 1010011 // 4개84 : 1010100 // 3개85 : 1010101 // 4개86 : 1010110 // 4개87 : 1010111 // 5개88 : 1011000 // 3개89 : 1011001 // 4개90 : 1011010 // 4개 78 -> 83 -> 85 -> 86 -> 89 -> 90 .. ??? 모르겠다 10진수를 2진수로 변환하였을때 1의 갯수를 새는 함수 num2_count1 를 정의하고 받은 숫자를 1씩 증가..

어떤 숫자 n 에 대하여 연속하는 자연수의 합으로 해당 숫자가 몇개 나오는지 확인 하는 문제 1+2+3+4+5 = 152+3+4+5+6 > 15 ... x 3+4+5+6 > 15 ... x ... 위와 같이 1부터 하나씩 더하면서 n 과 비교하는 방법이 될 수 있으나 n/2 이후의 구간부터는 사실상 의미없이 버려지는 부분이다. 7+8 = 15 .. o 8+9 > 15 .. x9+10 > 15 .. x... 15 = 15 ... o 따라서 이를 반영하기 위해서 다음과 같이 코드를 짜보았다. n 이 홀수 / 짝수 일 경우에 따라서 그 절반 or 절반을 반올림 한 숫자부터1씩 감소하며 연속하는 숫자의 합을 구하도록 하였다. def solution(n): # 자기자신 answer..

0111010 -> 0 제거 -> 1111 -> 길이(4) 를 2진법으로 표현 -> 100 -> 0 제거 -> 1 -> 종료 [반복횟수, 제거된 0의 갯수] 를 반환 == [2, 5] 문자열 s 에 대해서 before_len : 처음 문자의 길이 replace : 0 제거 after_len: 0이 제거된 후 문자의 길이 제거된 0의 갯수 : before_len - after_len s = after_len 을 2진법으로 바꾼 숫자의 문자형 다시 반복. 2진법으로 바꾸는 방법 bin , format 중에 format 을 사용함. value = 60 print(bin(value), type(bin(value))) # 0b111100 print(format(value, 'b'), type(format(valu..

문자열 s 가 ( 로 시작하여 ) 로 끝나야 한다는 뜻이다. 그렇다고 ( )) ( 가 올바르다는것도 아니다. 바로 생각나는 방법은 올바른 문자열 s 의 괄호중 맨 안쪽 괄호는 결국 () 인 문자가 나오게되며 해당 괄호를 제거하더라도 다시 () 괄호가 계속해서 1개 이상 존재하고 마지막엔 "" 으로 남게 될것으로 예상된다. 즉 반복문을 사용하여 () 를 -> "" 으로 바꾸어서 계속해서 줄여나가면 해결할수있을꺼같다. def solution(s): # () 가 있으면 지우기 while "()" in s: s = s.replace("()","") # 판단 if len(s) > 0 : return False return True 결과는 시간초과가 났다. () in s 가 문제인걸까 while 의 반복 횟수가 문..