본문 바로가기

백준32

BOJ 2615 - 오목(C++) https://www.acmicpc.net/problem/2615 2615번: 오목 오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호 www.acmicpc.net 풀이 자표와 방향성에 대해 탐색했는지 확인을 위한 bool 3차원 배열 visit 사용 오목판의 현재 위치에 대해 8방향을 탐색해야하지만 2중 for문을 이용해 왼쪽에서 오른쪽, 위에서 아래로 탐색하기 때문에 4방향으로만(동, 남동, 남, 남서) 제한하여 탐색 위의 방향으로 탐색할 경우 (1, 1)을 시작으로 연속되었는지 확인 한 후 (2, 2)에서 (1, 1)로 연속성을 확인 비효율적이고 vis.. 2021. 10. 5.
BOJ 14889 - 스타트와 링크(C++) https://www.acmicpc.net/problem/14889 14889번: 스타트와 링크 예제 2의 경우에 (1, 3, 6), (2, 4, 5)로 팀을 나누면 되고, 예제 3의 경우에는 (1, 2, 4, 5), (3, 6, 7, 8)로 팀을 나누면 된다. www.acmicpc.net 풀이 1. 스타팀에 누가 포함될지 N/2명을 뽑는 경우의 수에 대해 탐색 - bool 자료형의 1차원 배열 visit을 이용하여 스타트 팀에 포함되었는지 여부를 확인 - 배열의 값이 true면 스타트 팀, false면 링크 팀 2. 스타트 팀, 링크 팀에 대해 각각 점수 계산 - 2중 for문을 이용하여 i와 j가 같은 팀일때의 해당 팀의 점수를 더함 - visit[i] && visit[j] 이면 스타트 팀, !vis.. 2021. 10. 5.
BOJ 1912 - 연속합(C++) https://www.acmicpc.net/problem/1912 1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. www.acmicpc.net 풀이 연속된 수에 대한 최대값이기 때문에 2가지만 고려함 1. 연속하지 않을 때 - 이전 값과 연속할 때 현재 값보다 작은 경우, 자기 자신을 가지고 감 - dp[i] > (dp[i-1] + dp[i]) 2. 연속할 때 - 이전 값과 연속할 때 현재 값보다 큰 경우, 연속합을 가지고 감 - dp[i] < (dp[i-1] + dp[i]) 순서대로 탐색하며 1, 2를 적용하고 최대값을 갱신 #include #i.. 2021. 10. 5.
BOJ 3190 - 뱀(C++) https://www.acmicpc.net/problem/3190 3190번: 뱀 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임 www.acmicpc.net 풀이 Queue를 이용하여 뱀의 이동에 따른 머리의 위치정보를 계속 갱신 Queue는 FIFO(First In First Out)으로 Queue의 첫부분은 꼬리에 대한 정보, Queue의 끝부분은 머리에 대한 정보를 담음 1. 뱀 머리의 새로운 위치 계산 - 현재 뱀의 머리(Queue.back())와 방향 정보로 새로운 위치를 계산 - 계산한 위치가 격자를 벗어나거나 뱀의 몸에 부딪히면 게임 끝(retu.. 2021. 9. 29.
BOJ 12100 - 2048(Easy)(C++) https://www.acmicpc.net/problem/12100 12100번: 2048 (Easy) 첫째 줄에 보드의 크기 N (1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 게임판의 초기 상태가 주어진다. 0은 빈 칸을 나타내며, 이외의 값은 모두 블록을 나타낸다. 블록에 쓰여 있는 수는 2 www.acmicpc.net 풀이 상하좌우를 이용한 5번 이동에 모든 경우의 수를 탐색 해당 경우에 대해 이동(상하좌우 모든 경우에 대한 이동을 구현하지 않고 위로 이동에 대한 이동만 구현) - 상하좌우에 따라 회전 - 상 : 0˚, 하: 180˚, 좌 : 90˚, 우: 270˚ - 위로 이동 - 다시 제자리로 회전 - 상 : 0˚, 하: 180˚, 좌 : 270˚, 우: 90˚ - 5번의 이동이.. 2021. 9. 2.
BOJ 12015 - 가장 긴 증가하는 부분 수열2(C++) 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 풀이 벡터의 초기 상태 {0} 현재 입력 값이 벡터의 마지막 값보다 크면 -> 벡터에 push_back 작으면 -> lower_bound를 이용해 입력값보다 작거나 큰 위치를 찾아내서 교환 벡터의 초기값 0을 제외해야하기 때문에 v.size() - 1을 출력 더보기 ex) {10, 20, 30, 5, 10, 20, 30, 40} 0. {0} 1. 10 마지막 값보다 큼 {0, 10} 2. 20 마.. 2021. 9. 2.
BOJ 3020 - 개똥벌레(C++) https://www.acmicpc.net/problem/3020 3020번: 개똥벌레 개똥벌레 한 마리가 장애물(석순과 종유석)로 가득찬 동굴에 들어갔다. 동굴의 길이는 N미터이고, 높이는 H미터이다. (N은 짝수) 첫 번째 장애물은 항상 석순이고, 그 다음에는 종유석과 석순이 www.acmicpc.net 풀이 algorithm 라이브러리에서 제공하는 이진탐색 함수인 lower_bound, upper_bound를 이용하여 풀 수 있음 * 이진탐색을 위해서는 오름차순 정렬이 되어 있어야함 lower_bound(begin, end, target) : target 값 이상의 숫자가 배열 몇 번째에 있는지 탐색 upper_bound(begin, end, target) : target 값을 초과하는 숫자가 배열.. 2021. 9. 1.
BOJ 15684 - 사다리 조작(C++) https://www.acmicpc.net/problem/15684 15684번: 사다리 조작 사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선 www.acmicpc.net 풀이 추가한 가로선이 3개가 초과되지 않도록 모든경우의 수를 확인 원래의 세로선으로 돌아가는 지 세로선마다 확인 왼쪽으로 갈지, 오른쪽으로 갈지 구별하기 위해 왼쪽에서 오른쪽으로 이어지는 시작점만 true로 표기 더보기 if (map[y][now]) now++; else if (map[y][now - 1]) now--; ex) #include using namespace std; int N, M.. 2021. 8. 31.
BOJ 1946 - 신입 사원(C++) https://www.acmicpc.net/problem/1946 1946번: 신입 사원 첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성 www.acmicpc.net 서류와 면접 두 가지가 다른 지원자에 비해 떨어진다면 탈락 단순히 두 가지 조건에 대해 완전 탐색을 이용하기에는 시간초과가 발생, 최대한 탐색의 횟수를 줄이기 위해 고민했음 풀이 탐색하는 횟수를 줄이기 위해 우선 한가지 항목(서류 등수)에 대해 오름차순 정렬하여 탐색 다음 지원자(i+1)의 면접등수가 현재(i)의 지원자의 면접 등수보다 크다면 (i+1)순번의 지원자는 (i)지.. 2021. 8. 27.