본문 바로가기

전체 글

[알고리즘][누적합] 슬라이딩 윈도우 알고리즘(Sliding Window Algorithm), 카데인 알고리즘(Kadane`s Algorithm), 원형 배열 부분집합 최대 합 구하기 - 컴도리돌이 오늘 기업 코테를 보았다. 누적합에 대해 2문제씩이나 출제가 되었다. 문제를 다 풀긴 했지만 효율성에서 어떻게 될지 모르겠다. 오늘 코테 풀이에 아쉬움이 남아서 누적합에 대해 다시 돌아보는 시간을 가져보자. 코테의 첫 번째 누적 합의 문제는 연속된 k개의 값들의 합 중에서 가장 큰 값을 출력하는 문제였다. 나는 해당 문제를 슬라이딩 윈도우 알고리즘으로 해결하였다. 슬라이딩 윈도우 알고리즘(Sliding Window Algorihtm)은 배열이나 리스트의 요소의 일정 범위의 값을 비교할 때 사용하면 유용한 알고리즘이다. 예르 들어 정수로 이루어진 배열 {1, 4, 2, 5, 1}에서 길이가 2인 서브 배열의 합계가 가장 큰 서브 배열을 구할 때, 해당 알고리즘을 이용해서 해결한다. 슬라이딩 윈도우는 크기가.. 더보기
[Python][백준 2632][누적합] 피자판매 - 컴도리돌이 2632번: 피자판매 첫 번째 줄에는 손님이 구매하고자 하는 피자크기를 나타내는 2,000,000 이하의 자연수가 주어진다. 두 번째 줄에는 A, B 피자의 피자조각의 개수를 나타내 는 정수 m, n 이 차례로 주어진다 (3 ≤ m, n www.acmicpc.net 피자 A와 피자 B에서 나올 수 있는 피자 조각의 합 경우의 수를 각각의 딕셔너리에 저장한다. 하나의 피자에서 나올 수 있는 모든 경우의 수를 탐색한다. 하나의 피자에 존재하는 조각의 개수가 1000개 이하이므로 반복문 2개를 중첩하여 모든 경우의 수를 탐색하여도 시간 초과가 발생하지 않는다. 출력 딕셔너리_A [문제에서 요구하는 피자 사이즈] + 딕셔너리_B [문제에서 요구하는 피자 사이즈] + 딕셔너리_A [A에 있는 값] + 딕셔너리_B.. 더보기
[JAVA][백준 17845][배낭문제] 수강 과목 - 컴도리돌이 17845번: 수강 과목 첫줄에 서윤이의 최대 공부시간 N (1 ≤ N ≤ 10,000), 과목 수 K (1 ≤ K ≤ 1,000)이 공백을 사이에 두고 주어진다. 이후 K개의 줄에 중요도 I (1 ≤ I ≤ 100,000), 필요한 공부시간 (1 ≤ T ≤ 10,000)이 www.acmicpc.net 17845번 DP문제 중에 knapsack 문제로 해결해야 합니다. bag[M][N]을 1부터 M+1번째 과목들을 대상으로 최대 N시간을 써서 얻을 수 있는 가장 큰 중요도를 구해야 합니다. 현재 i번째 시간으로 들을 수 있을 경우 이전 과목을 들은 경우와 현재 i번째 시간 전 + 현재 i번째 우선도를 비교해서 최대 값으로 bag [i][j]를 갱신해줘야 합니다. 현재 i번째 시간으로 듣지 못할 경우는 이.. 더보기
[JAVA][백준 12015][이분 탐색] 가장 긴 증가하는 부분 수열2 - 컴도리돌이 12015번: 가장 긴 증가하는 부분 수열 2 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000) www.acmicpc.net 해당 문제는 이분 탐색으로 해결했습니다. 주어진 N만큼 반복문을 시행합니다. arr의 맨 뒤 값보다 현재 주어진 값보다 작을 경우 arr의 맨 뒤에 해당 값으로 업데이트 해줍니다. 그 반대일 경우 이분 탐색으로 주어진 값의 인덱스를 찾아줍니다. 파이썬 풀이 [Python][백준 12015][이분 탐색] 가장 긴 증가하는 부분 수열 2 - 컴도리돌이 풀이 과정 해당 문제는 bisect 라이브러리를 사용해서 해결하였다. bisect에 대해서는 아래 링크를 참조하면 좋.. 더보기
[Python][백준 12015][이분 탐색] 가장 긴 증가하는 부분 수열 2 - 컴도리돌이 풀이 과정 해당 문제는 bisect 라이브러리를 사용해서 해결하였다. bisect에 대해서는 아래 링크를 참조하면 좋다. [Python] bisect - 컴도리돌이 알고리즘 문제를 해결하다가 다른 분의 블로그에서 제가 푼 알고리즘 문제를 파이썬에서 제공하는 표준 라이브러리인 bisect를 이용해서 간단하게 문제를 해결한 것을 보고, 요번 기회에 bisect 라 comdolidol-i.tistory.com 1. 입력받은 배열의 0번째 인덱스 값부터 순차적으로 반복문을 시행한다. 2. arr가 비어있으면 x 값을 arr에 insert 한다. 3. 현재 x 값이 arr의 마지막 인덱스 값보다 크면 insert 시킨다. 4. 마지막 인덱스 값보다 크지 않으면 bisect_left 함수를 이용해서 x값보다 같거나.. 더보기
[Java][백준 2470][투 포인터] 두 용액 - 컴도리돌이 2470번: 두 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00 www.acmicpc.net 해당 문제는 투 포인터 알고리즘으로 해결하였습니다. 두 용액의 합이 0과 가장 근사한 한 쌍을 찾아야 하는 문제입니다. 입력받은 용액의 배열을 정렬을 시키고 왼쪽 인덱스의 값과 오른쪽 인덱스의 값을 더해서 절댓값이 minValue보다 작으면 출력 값(ans1, ans2)과 minValue를 업데이트합니다. 만약 minValue가 0이면 ans1과 ans2를 출력시키고 return 해줍니다. 왼쪽 인덱스의 값과 오른쪽 인덱스의 값.. 더보기
[Python][백준 2470][투 포인터] 두 용액 - 컴도리돌이 풀이 과정 해당 문제는 단순한 투 포인터 문제이다. 두 값의 합이 0과 가까운 쌍을 찾으면 끝이다. 1. 주어진 x 배열을 정렬시킨다. 2. 문제에서 수들의 합이 매우 크기 때문에 minV를 매우 큰 값으로 설정하였다. 3. 투 포인터를 사용하기 때문에 0번째 인덱스와 n-1 인덱스부터 시작한다. 4. 오른쪽 인덱스 s와 왼쪽 인덱스 e의 합을 m으로 지정한다. 5. 절댓값 m이 minV보다 작을 경우 minV를 m으로 업데이트해준다. ans를 현재 x [s], x [e]로 업데이트해준다. 6. minV이 0이면 반복문을 종료하고 현재 ans을 출력한다. 7. m 값이 0보다 작을 경우 오른쪽 인덱스를 증가시키고 반대일 경우 왼쪽 인덱스를 감소시킨다. 풀이 코드 n,*x= map(int,open(0).r.. 더보기
[Python][백준 2234][BFS] 성곽 - 컴도리돌이 풀이 과정 본 문제는 전형적인 BFS문제이다. 왜냐하면 연결되어 있는 방의 개수를 물어봤기 때문이다. 부가적으로 특이한 요소를 첨가하였다. 각 좌표들 간에 연결되었는지를 15 이하의 값으로 주어져있다. 0~15 (?) 문제에서 언급한 힌트대로 이 문제는 좌표 이동을 비트 마스킹을 해준다. 하지만 비트 마스킹이 익숙하지 않아서,,, 나는 문자열로 표시를 하였다. 물론 하는 방법은 비트 마스킹이랑 똑같다..! "0000" ~ "1111" 맨 왼쪽부터 서북 동남을 의미하고 1은 이동 불가(벽으로 연결)를 의미하고 0은 이동 가능을 의미한다. 1. m*n 만큼 반복문을 돌려서 해당 (i, j) 위치를 방문하지 않을 경우 BFS 탐색을 한다. 2. 현재 위치 값을 bin함수를 이용하여 이진수를 나타내고 크기를 4.. 더보기

728x90