목록전체 글 (119)
기록
programmers.co.kr/learn/courses/30/lessons/64061 코딩테스트 연습 - 크레인 인형뽑기 게임 [[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4 programmers.co.kr def solution(board, moves): answer = 0 doll = [] for m in moves: for b in board: if b[m-1] == 0: continue else: doll.append(b[m-1]) b[m-1] = 0 break if len(doll) >= 2: if doll[-1] == doll[-2]: doll.pop() doll.pop() answer += 2..
programmers.co.kr/learn/courses/30/lessons/68935 코딩테스트 연습 - 3진법 뒤집기 자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요. 제한사항 n은 1 이상 100,000,000 이하인 자연수 programmers.co.kr 문제의 요구사항은 매개변수로 받아온 10진수를 3진법으로 변환 후, 그 3진법을 뒤집어서 다시 10진법으로 바꾸는 것입니다. 그런데 3진법 기준 끝 숫자부터 list에 저장됨으로 굳이 뒤집을 필요는 없겠습니다. [ 내장함수를 활용한 풀이 ] def solution(n): answer = '' while n >= 1: n, rest..
programmers.co.kr/learn/courses/30/lessons/17681 코딩테스트 연습 - [1차] 비밀지도 비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다 programmers.co.kr 십진수를 이진수로 바꾼 후 비트연산을 활용한 문제입니다. def solution2(n, arr1, arr2): answer = [] for num1, num2 in zip(arr1, arr2): tmp = bin(num1 | num2)[2:] if len(tmp) < n: tmp = '0'*(n-len(tmp)) + tmp tmp = tmp.replace('1', '#..
programmers.co.kr/learn/courses/30/lessons/17682 코딩테스트 연습 - [1차] 다트 게임 programmers.co.kr 간단한 게임을 만드는 문제입니다. def solution(dartResult): answer = 0 idx = 0 prevNum = 0 num = 0 ten = False for i in range(len(dartResult)): if dartResult[i].isdigit(): if ten == True: continue idx = 0 if dartResult[i+1] == '0': ten = True # 중첩스타상 당할 수 있음으로 prevNum을 더함 answer += prevNum prevNum = num if ten == True: num..
dp 문제입니다. 증가하는 부분 수열이 여러 개 나올 수 있습니다. 특히, 어떤 인덱스에 이전에 존재하던 증가하는 부분 수열보다 작은 수가 등장한 이후로 이전에 존재하던 증가하는 부분 수열보다는 작지만 계속해서 증가를 하는 수열이 나온다면? 가장 긴 증가하는 부분 수열은 갑자기 등장한 수부터 시작하는 증가하는 부분 수열이 될 것입니다. 그렇기에 이각 항마다 가장 긴 증가하는 부분 수열의 길이를 저장해 답을 구합시다. 보다 이해를 돕기 위해 수열 {5, 10, 3, 30, 5, 7, 20} 을 예로 들어보겠습니다. d[i]는 i항에서 가장 긴 증가하는 부분 수열의 길이입니다. d[1] = 1 | {5} 입니다. d[2] = 2 | {5, 10} 입니다. d[3] = 1 | {3} 입니다. d[4] = 3 ..
programmers.co.kr/learn/courses/30/lessons/42883 반복마다 허용 가능한 범위로 문자열을 잘라 그 범위 내에서 가장 큰 수를 구해 answer에 이어붙이며, 방금 구한 큰 수의 다음 인덱스 자리수부터 다시 큰 수를 찾는 식으로 답을 구했습니다. 이해를 돕고자 1829라는 숫자로 2자리 수의 가장 큰 수를 만드는 예시를 들어볼게요. 처음에는 182까지, 즉 [:-1] 까지의 수를 확인해야 합니다. 끝자리까지 검사해서 9를 max값으로 잡아버린다면 그 다음 자리수를 못 구하기 때문이에요. 이러한 방식으로 처음에 코딩을 했는데 테스트케이스 8번에서 틀리고, 10번에서 시간초과가 나서 고생했습니다. 테스트케이스 10번 시간초과 해결하기 일단 위에 기술한 방법이 O(N)이기에 ..
https://m.blog.naver.com/PostView.nhn?blogId=i5533m&logNo=221585540876&proxyReferer=https:%2F%2Fwww.google.com%2F
int func(int n) { if (n == 1) return 1; else if (n % 2 == 1) return n + func(n - 1); else return func(n / 2) * 2 + (n*n) / 4; } 1 + 2 + ... + n -> (1 + 2 + ... n/2) + ((n/2 + 1) + (n/2 + 2) + ... + (n/2 + n/2)) -> (1 + 2 + n/2) * 2 + (n/2 * n/2) // n/2가 n/2개 있음으로 뒤로 뺀다 따라서 n이 짝수일 때 f(n) = f(n/2)*2 + (n*n)/4 n이 홀수일 땐 f(n) = n + f(n-1) n이 1이면 1을 반환
char arr[1000005]; cin >> arr; char* temp = strtok(arr, "[,]"); while (temp) { D.push_back(int(temp - '0')); cout