Algorithm

https://www.acmicpc.net/problem/1799 1799번: 비숍 첫째 줄에 체스판의 크기가 주어진다. 체스판의 크기는 10이하의 자연수이다. 둘째 줄부터 아래의 예와 같이 체스판의 각 칸에 비숍을 놓을 수 있는지 없는지에 대한 정보가 체스판 한 줄 단위로 www.acmicpc.net 1. Logic 비숍이 움직일수 있는 특징은 검은색 칸은 흰색에 흰색은 검은색에 서로 영향을 주지 않는다. 그렇기 때문에 관점을 두개를 같이 보지말고 검은색은 검은색끼리 흰색은 흰색끼리 봐야한다. 이 특성을 이용하여 비숍을 놓기 위해서는 비숍을 놓을 위치의 대각선 방향에 다른 비숍이 있는지 없는지를 알고있어야 한다. N * N의 체스판에서 생기는 대각선의 갯수는 2N -1개이므로 N의 최대가 10이기 때문..
https://school.programmers.co.kr/learn/courses/30/lessons/148653?language=cpp 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 1. Logic 항상 +1돌 or -1돌을 사용하여 1의 자리를 0을 만든 후에 큰 숫자로 빼주는 방법이 최선의 방법이다. 부분문제가 3가지로 쪼개지는데 1. 1의 자리가 6이상인 수 (6~ 9) 2. 1의 자리가 5인 수 (5) 3. 1의 자리가 4이하인 수 (0~4) 1번의 경우에는 10을 만들어준 후 10을 만드는데 사용한 +1돌의 갯수를 계산해서 더해주고 10을 만..
https://www.acmicpc.net/problem/12100 12100번: 2048 (Easy) 첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2 www.acmicpc.net 1. Logic - 구현은 항상 느끼는 거지만 문제에 있는 그대로 구현만 잘 하면 된다ㅋㅋㅋㅋ근데 실수하지 않고 구현하는게 어렵다ㅜ 풀이 로직을 보자면 한번 키보드를 누를 때 마다 블럭들을 이동시키면서 합칠게 있으면 합쳐줘야한다. 5번 옮길 수 있다고 했기 때문에 재귀를 사용하여 5번 움직이는 동안 블럭들을 상하좌우 옮겨주고 5번이 됐을 때 계산해서 블럭의 Value의..
https://www.acmicpc.net/problem/9252 9252번: LCS 2 LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. www.acmicpc.net 1. Logic LCS1 문제에서 구현한 것을 반대로 재귀호출을 한 다음 return 하면서 해당하는 문자 값을 출력하는 문제. LCS를 구할 때는 topdown으로 풀었는데 여기서 지나온 경로를 찾으려니 잘 안되어 다른 블로그를 참고하여 bottomup 방식으로 풀이했다 지나온 경로를 찾는 원리는 LCS를 구하는 과정에서 str1[s1-1] == ..
https://www.acmicpc.net/problem/2805 2805번: 나무 자르기 첫째 줄에 나무의 수 N과 상근이가 집으로 가져가려고 하는 나무의 길이 M이 주어진다. (1 ≤ N ≤ 1,000,000, 1 ≤ M ≤ 2,000,000,000) 둘째 줄에는 나무의 높이가 주어진다. 나무의 높이의 합은 항상 M보 www.acmicpc.net 1. Logic 스탠다드한 이분탐색 문제이다. 주의할 점은 문제에서 포커스를 맞춰야 할 곳이 절단기에 설정할 높이를 구하는 것이고, 절단기에 설정한 높이를 나무의 길이에서 빼준 값으로 비교해야 한다는 점이다. 이분탐색이 이해가 잘 안간다면 아래의 알고리즘 설명글을 참고하면 좋을 것 같다! https://go2gym365.tistory.com/87 [Algor..
https://www.acmicpc.net/problem/2565 2565번: 전깃줄 첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는 www.acmicpc.net 1. Logic - 기본적인 LIS문제이다. 이 문제가 LIS인 이유는 전깃줄이 교차하지 않아야한다는 것은 이전 전깃줄의 번호가 다음 전깃줄의 번호보다 커지면 안되고 항상 작은 번호여야하기 때문에 증가하는 부분수열이 될 수 밖에 없다. 다른 LIS문제와 다른점은 단지 입력 값을 pair로 받아 준 다음 A를 기준으로 오름차순 정리해주고 B를 기준으로 LIS를 찾아주면 된다. 공부겸 시간복잡도가 O(nlo..
https://www.acmicpc.net/problem/2473 2473번: 세 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 www.acmicpc.net 1. Logic 기초적인 Tow pointer 문제지만 여기선 세개의 용액을 구해야하기 때문에 아이디어가 필요하다. 문제를 처음 보고 떠오른 아이디어는 한용액은 고정으로 하고 나머지 두개만 고르면 되겠다! 이거였다. 그리고 내가 생각한 아이디어가 맞았다. 기본 로직을 적어보자면 1. 0번째 인덱스부터 n - 2번째 인덱스 까지 for문을 돌면서 고정할 용액을 정한다. 2. 남..
https://www.acmicpc.net/problem/2568 2568번: 전깃줄 - 2 첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100,000 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결 www.acmicpc.net 1. Logic 처음 보면 무슨 문제가 싶지만 문제를 읽으면서 예제를 보면 LIS문제인것을 알 수 있다. 문제 푸는 로직을 나열해보자면 1. 입력을 받은 수들을 vector에 pair로 저장을 하고 A를 기준으로 오름차순 정렬한다. 2. lis vector의 back값과 계속 비교하여 LIS를 이루는 값이 들어오면 lis에 넣어주고 cnt를 올려준다. 혹은 탐색값이 lis의 back보다 더 작..
https://www.acmicpc.net/problem/14003 14003번: 가장 긴 증가하는 부분 수열 5 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (-1,000,000,000 ≤ Ai ≤ 1,000,000,000) www.acmicpc.net 1. Logic - 기본 구성은 가장 긴 증가하는 부분수열 2, 3과 똑같다. 하지만 여기서는 역추적을 통해 LIS가 어떻게 구성되었는지 경로를 출력해야한다. 경로를 갱신해 줄 때 아무값이나 막 넣어주면 안되기 때문에 첫번째로 LIS인 수열에 대해서 입력해준다. 즉 이전에 들어간 숫자보다 더 큰 숫자가 나올경우 경로를 갱신해준다. 만약 이전에 들어간 숫자보다 작은 숫..
https://www.acmicpc.net/problem/12015 12015번: 가장 긴 증가하는 부분 수열 2 첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000,000) www.acmicpc.net 1. Logic 이전 가장 긴 증가하는 부분 수열 문제에서는 DP를 사용해서 풀었다. DP를 사용하는 풀이에서는 전체를 돌면서 확인 하며 메모이제이션 했기때문에 시간복잡도가 O(N^2)이었다. 하지만 이 문제에서는 입력값이 엄청 많기 때문에 N^2으로 풀지 못하기 때문에 시간복잡도가 O(nlogn)을 가지는 이분탐색 기반으로 풀어야 한다. binary search를 구현해서 푸는 방법과 C++의 ..
보글보글소다
'Algorithm' 카테고리의 글 목록 (16 Page)