전체 글 280

[백준] 선 긋기 2170번 (C++) 라인스와핑

출처 :https://www.acmicpc.net/problem/2170풀이 방법라인스와핑 문제로 경우를 나누면 탐색 한 번으로 풀이할 수 있다.먼저 선을 시작 좌표, 마지막 좌표 기준으로 정렬한다.그 후 줄이 끊기는 경우와 연장되는 경우를 나누어 풀이하면 된다.줄이 연장이 되려면 현재 줄의 end보다 다음 줄의 시작 부분의 좌표가 작아야 한다. 그리고 현재 줄의 마지막과 다음 줄의 마지막 중 좌표가 큰 것을 end 좌표로 설정한다. 끊기는 경우는 다음 시작 좌표가 현재 end좌표보가 큰 경우로 이때 끊긴 줄의 길이를 더해주고 start, end값을 초기화해준다. 루프를 다 돈 후 마지막 줄에 대해 더해주는 과정이 필요하다. 입력이 많은 문제이므로 아래 코드를 추가하지 않으면 시간초과가 발생한다.  ..

Algorithm 2024.10.10

[백준] 미세먼지 안녕! 17144번 (c++) 구현, 로컬 배열 선언의 중요, 탐색 순서의 중요

출처 : https://www.acmicpc.net/problem/17144 풀이 방법문제의 핵심미세 먼지는 동시에 전파된다.임시 배열을 사용해서 한 번에 업데이트하면 된다.임시 배열을 로컬 변수로 선언했다. 로컬 배열은 항상 memset으로 초기화 해야한다.공기 청정기의 미세먼지 밀어내기 구현코너 부분에서 간단하게 구현하기 위해 밀어내기를 구현하는 순서가 중요하다.윗부분 같은 경우 왼쪽, 밑, 오른쪽, 위 쪽 순서로 밀어낸다면 코너 부분에 크게 신경 쓰지 않아도 된다.공기 청정기 위 아래 구하기두 입력을 받고 정렬을 통해 위 아래 구분이 가능하다.#include #include #include #include using namespace std;int R, C, T;int room[51][51];vec..

Algorithm 2024.10.03

[백준] 수 묶기 1744번 (c++) 그리디, 수를 잘 나누기

출처 :https://www.acmicpc.net/problem/1744풀이 방법그리디 문제로 엣지 케이스를 생각하는 것이 쉽진 않았다.아래 규칙만 잘 지켜 준다면 해결 가능하다.1. 양수면 무조건 큰 수 끼리 곱하기2. 만약 수가 1이면 곱하지 않고 더하기3. 음수 끼리 곱하면 양수가 되므로 작은 수끼리 곱하기4. 양수 또는 음수가 홀수개가 존재하면 마지막 수는 그냥 더하기 문제의 핵심 포인트 : 수를 잘 나누어서 저장한다 (양수, 0 이하 따라)수를 나누어 저장해 계산을 구현하기 쉽게 한다. #include #include #include using namespace std;int N ,ans = 0;vector p, n; bool cmp1(int a, int b) { return a > b;..

Algorithm 2024.10.02

[백준] 경사로 14890 (c++) 구현

출처 : https://www.acmicpc.net/problem/14890풀이 방법길이가 같을 땐 count를 올리다가 높이 차이가 정확하게 1 정도만 난다면 경사로를 추가해서 이동하는 문제이다먼저 새로와 가로를 나누어 2번 for문을 반복했다.또한 cnt변수를 두어 현재까지의 연속된 길이를 저장하고, 높이가 높아졌을 때 L보다 크면 cnt를 1로 초기화했다. 또한 높이가 낮아졌을 때는 cnt를 -L+1을 하는 과정을 두어 이후에 같은 길이가 L개의 같은 길이가 나오게 된다면 가능한 경우로 설정했다. 만약 그전에 높이가 다르게 된다면 플레그 변수를 false로 설정했다.  #include #include using namespace std;int N, L;int board[101][101];int an..

Algorithm 2024.10.02

[백준] 퇴사 2 15486번 (c++) dp 최댓값으로 갱신하기

출처 : https://www.acmicpc.net/problem/15486 풀이 방법일반적인 dp 알고리즘인데 여기서 고려해야 할 부분은 경계 값의 처리와, 일을 건너뛰는 경우 최댓값으로 갱신해야 한다는 것이다. dp[i]를 i일 이전까지의 최대로 벌 수 있는 돈이라고 하고 work[i][0], work[i][1]을 각각 소요 시간과, 버는 돈이라고 했을 때점화식을 dp[i + work[i][0]] = max(dp[i], dp[i + work[i][0]])로만 설정한다면 아래와 같은 문제가 발생한다.1~3까지 50만 원  5~6까지 20만 원을 벌 수 있을 때 5일에 일을 시작할 때도 50만 원이 최대였다면 50만 원으로 시작해야 하는데, 0원으로 시작한다는 것이다. 그러므로 4일에서 5일에 시작하더라..

Algorithm 2024.10.01

[오라클] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 TO_DATE, EXTRACT

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/151139?language=oracle 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr풀이 방법먼저 대여 시작일이 8월에서 11월까지인 대여를 추출하기 위해 TO_DATE함수를 사용해서 8월 1일과 11월 1일을 DATE로 만들어 준 후 비교한다. 그 후 같은 CAR_ID끼리는 그룹화해 대여 횟수가 5번 이상인 CAR_ID를 추출한다.DATE TYPE에서 MONTH를 추출하기 위해 EXTRACT함수를 사용해서 MONTH만 추출해 준다.EXTRACT..

SQL 2024.09.24

[백준] 친구비 16562번 (c++) bfs

출처 : https://www.acmicpc.net/problem/16562 풀이 방법간단한 bfs문제이다.친구의 친구도 친구, 친구의 친구의 친구도 친구 이므로 bfs를 통해 친구 그룹을 만든 후 그 친구들 중 친구비가 가장 작은 값을 구해서 더해주면 된다.#include #include #include #include #include using namespace std;int N, M, K;vector money;vector > f;int visited[10001];int bfs(int idx) { int min_money = money[idx]; // 현재 친구 그룹에서 가장 작은 값 queue q; q.push(idx); visited[idx] = 1; while(!q...

Algorithm 2024.09.24

[백준] 미로만들기 2662번 (c++) bfs, 우선순위 큐

출처 : https://www.acmicpc.net/problem/2665풀이 방법먼저 일반적인 bfs알고리즘으로 방문 배열을 visited[y][x][cnt] y, x에서 cnt만큼 검은 방을 뚫고 온 경우로 설정한 후 풀이하였다.이때 cnt 2501로 설정해 주어야 한다. (50*50) 처음에 51로 설정해서 틀렸다. 그 후 다음 좌표의 값이 방문하지 않았고 방이 검은 방인지 흰 방인지에 따라 흰 방이라면 바로 큐에 넣어주고 검은 방이라면 cnt + 1을 해주어서 큐에 넣어주었다.코드 #include #include #include #include #include using namespace std;int N, ans = 987654321;int room[51][51];int visited[51][5..

Algorithm 2024.09.23

[백준] 감시 15683번 (c++) 구현, 배열 선언 위치의 중요성

출처 : https://www.acmicpc.net/problem/15683풀이 방법백트레킹을 이용한 브루트포스 문제이다. 사무실의 크기가 최대 8x8 이므로 브루트포스를 사용해서 성공할 수 있다.cctv를 dfs로 돌아가며 하나씩 최대 4개의 방향을 돌아가며 다 검사하고 백트레킹을 통해 다시 돌아오는 삼성 기출문제의 연구실 문제와 유사하다.  cctv의 타입에 따라 조사할 방향을 정해두면 된다. 나는 아래와 같이 구현했다. 아래 코드에서 i는 for 문을 통해 0에서 3까지 반복 진행한다.타입이 1인 경우 한쪽 방향만 볼 수 있다.타입이 2인 경우 양 쪽 끝방향을 볼 수 있다.타입이 3인 경우 직각인 방향을 볼 수 있다.타입이 4인 경우 3가지 방향을 볼 수 있다.타입이 5인 경우 4방향 다 볼 수 있..

Algorithm 2024.09.22

[백준] 로봇 청소기 14503번 (c++) 구현

출처 : https://www.acmicpc.net/problem/14503풀이 방법로봇 청소기의 작동 방법 설명에 따라 그대로 코드로 구현했다. 먼저 방향을 북, 동, 남, 서 순서로 0번 인텍스에서 3번 인덱스까지 정장한다.90도 반시계 방향으로 회전하는 방법은 현재 방향의 인덱스에 +3을 한 후 4로 나누었을 때 나머지를 통해 구하고후진하는 방법은 현재 방향의 인덱스에 +2를 한 후 나머지 4 연산을 통해 구현했다.그 후 각 방향에서 앞칸이 방안인지 벽인지, 청소 가능 구역인지를 판단한 후 설명 방법에 따라 구현을 했다.청소를 완료한 칸은 2로 설정했다. #include #include using namespace std;int dy[4] = {-1, 0, 1, 0}; // 북, 동, 남, 서int..

카테고리 없음 2024.09.22