본문 바로가기

Algorithm

(2139)
(C++) - 프로그래머스(월간 코드 챌린지 시즌2) : 모두 0으로 만들기 programmers.co.kr/learn/courses/30/lessons/76503 코딩테스트 연습 - 모두 0으로 만들기 각 점에 가중치가 부여된 트리가 주어집니다. 당신은 다음 연산을 통하여, 이 트리의 모든 점들의 가중치를 0으로 만들고자 합니다. 임의의 연결된 두 점을 골라서 한쪽은 1 증가시키고, 다른 한 programmers.co.kr dfs로 푼 문제였습니다. 풀이방법 1. cost를 모두 더했을 때 0이 아니라면 -1을 반환합니다. 2. 그래프를 인접리스트로 재구성합니다. 3. dfs를 시행합니다. 어떤 정점에서 시작해도 모든 정점을 확인하기 때문에 정답을 구할 수 있습니다. 연결된 모든 정점을 확인하면서 다음 정점의 cost 절댓값을 ans변수에 더해줍니다. 현재 정점의 cost는 n..
(C++) - 프로그래머스(월간 코드 챌린지 시즌2) : 괄호 회전하기 programmers.co.kr/learn/courses/30/lessons/76502 코딩테스트 연습 - 괄호 회전하기 programmers.co.kr 간단한 스택, 구현 문제였습니다. 풀이방법 1. 왼쪽으로 회전시킨다는 의미는 가장 끝에있는 문자열을 처음으로 위치시키고 0번쨰 ~ size-1까지를 그 다음에 위치시키는 것입니다. 회전한 문자열을 반환하는 함수를 만들어줍니다. 2. 올바른 문자열인지 check해주는 함수를 만들어 줍니다. 여는 괄호라면 stack에 해당 문자열을 push해줍니다. 닫는 괄호라면 다음을 수행합니다. 먼저 여는 괄호가 없는데 닫는 괄호가 나왔다면 0을 반환합니다. stack이 비어있을 때 stack.top()을 해서 접근하면 segmentation fault이므로 !empt..
(C++) - 백준(BOJ) 1261번 : 알고스팟 www.acmicpc.net/problem/1261 1261번: 알고스팟 첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미 www.acmicpc.net 다익스트라로 푼 문제였습니다. 풀이방법 1. nx행,ny열에 도착했을 때 부수는 최소 벽의 개수를 저장할 dist배열을 선언해 큰 값 0x3f3f3f3f로 초기화해줍니다. priority_queue를 이용해 항상 왼쪽 위 정점을 우선으로 볼 수 있도록 합니다. 2. nx행 ny열이 벽인 경우에는 벽을 부숴야하는지를 확인해줍니다. 현재지점(x,y)에서 nx,ny로 도착하기 위해서는 벽을 부숴..
(C++) - 백준(BOJ) 12101번 : 1, 2, 3 더하기 2 www.acmicpc.net/problem/12101 12101번: 1, 2, 3 더하기 2 n을 1, 2, 3의 합으로 나타내는 방법 중에서 사전 순으로 k번째에 오는 것을 출력한다. k번째 오는 식이 없는 경우에는 -1을 출력한다. www.acmicpc.net backtracking문제였습니다. 풀이방법 1. 1,2,3중에 중복가능하게 i개를 골라 식을 만들었을 때 num과 같다면 vector 변수 ans에 넣어줍니다. 2. 매번 3개의 분기로 호출이 되므로 시간복잡도는 i * 3^i 가 됩니다. Code #include using namespace std; int n,k; vector ans; void backtracking(int idx,int m,int num,string op){ if(idx ..
(C++) - 백준(BOJ) 1748번 : 수 이어 쓰기 1 www.acmicpc.net/problem/1748 1748번: 수 이어 쓰기 1 첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다. www.acmicpc.net 수학문제였습니다. 풀이방법 1. 단순 반복문으로는 시간초과 또는 메모리 초과를 맛볼 수 있으니 자릿수가 달라지는 구간에 대해 수학적으로 접근해야 합니다. 2. n이 1 ~ 9까지는 자리수가 1개씩 더해집니다. 10 ~ 99까지는 자리수가 2개씩 더해집니다. 100 ~ 999까지는 자리수가 3개씩 더해집니다. 따라서 n의 자리수만큼 loop를 돌며 해당하는 값을 적절히 더해주면 됩니다. Code #include #include using namespace std; int ans, margin, behind = 9, after = 1;..
(C++) - 백준(BOJ) 3020번 : 개똥벌레 www.acmicpc.net/problem/3020 3020번: 개똥벌레 개똥벌레 한 마리가 장애물(석순과 종유석)로 가득찬 동굴에 들어갔다. 동굴의 길이는 N미터이고, 높이는 H미터이다. (N은 짝수) 첫 번째 장애물은 항상 석순이고, 그 다음에는 종유석과 석순이 www.acmicpc.net 이분 탐색 문제였습니다. 풀이방법 1. 석순이나 종유석의 서순은 중요하지 않습니다. 높이에 따라 부서질지 아닐지만 확인하면 되기 때문에 정렬해도 문제였습니다. 석순과 종유석에 대한 입력을 두개의 vector 변수에 나눠 담고 오름차순으로 sort해줍니다. 2. 구역을 1부터 시작해 height까지 loop를 돌며 최소의 장애물 파괴 수를 구합니다. 석순의 경우 선택한 구역(i) 이상의 높이를 가진 인덱스를 구해줍니..
(C++) - 백준(BOJ) 20056번 : 마법사 상어와 파이어볼 www.acmicpc.net/problem/20056 20056번: 마법사 상어와 파이어볼 첫째 줄에 N, M, K가 주어진다. 둘째 줄부터 M개의 줄에 파이어볼의 정보가 한 줄에 하나씩 주어진다. 파이어볼의 정보는 다섯 정수 ri, ci, mi, si, di로 이루어져 있다. 서로 다른 두 파이어볼의 위치 www.acmicpc.net 구현문제였습니다. 풀이방법 1. 파이어볼은 행,열,질량,속도,방향 5개의 정보를 포함하고 있습니다. 구조체를 이용해줍니다. 해당 구조체들을 원소로 파이어볼들의 정보를 담은 vector 변수 fireBalls, 격자의 정보를 저장할 vector변수 board를 선언해줍니다. 그리고 8방향을 표현할 dx,dy배열, 모두 홀수또는 짝수 방향일 때 분산시킬 방향의 정보를 담는 o..
(C++) - 백준(BOJ) 13023번 : ABCDE www.acmicpc.net/problem/13023 13023번: ABCDE 문제의 조건에 맞는 A, B, C, D, E가 존재하면 1을 없으면 0을 출력한다. www.acmicpc.net dfs문제입니다. 풀이방법 1. 인접리스트로 친구관계를 만들어줍니다. 친구 사이니 양방향 그래프가 됩니다. 2. dfs를 수행합니다. 확인하지 않는 친구사이들 중에 dfs가 5번 호출이 되었다는 뜻은 조건에 부합하다는 말입니다. ABCDE순으로 dfs가 호출되었다면 해당 관계가 존재한다는 뜻으로 1을 return해줍니다. 3. 자신과 연결된 모든 친구관계를 확인했다면 자신을 통해 다른 친구관계를 확인할 수 있도록 자신을 체크했던것을 0으로 만들어줍니다. Code #include using namespace std; ..