목록알고리즘 풀이 (63)
하다보니
문제 설명 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 리턴하도록 solution 함수 완성하라. 원형 수열이란 처음과 끝이 연결되어 있는 수열을 말한다. https://school.programmers.co.kr/learn/courses/30/lessons/131701 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 문제 풀이 처음에 접근하기를 원형 수열이니 배열을 뒤로 이어 붙여서 원본 배열의 원소 갯수만큼 slice를 해서 해당 slice 배열의 합의 집합을 구하면 되지 않을까 생각했다. 즉 핵심은 1. 배열을 이어 붙인다. 2. s..
알고리즘을 그래도 꾸준히 풀었다고 생각했는데 하반기 코테 탈락이 많았다. 뭐가 문제일까. 왜 꾸준히 풀었다고 생각했지만 실력이 늘었다는 느낌이 없을까 고민해보니 문제가 몇 가지 있었다. 1. 시간을 정하지 않고 푼다. 고민 시간을 정해놓지 않으니 집중해서 풀이법을 생각해내지 않고 그렇다고 끝까지 붙잡아서 풀어내는 것이 아니라 설렁설렁 고민하다가 구글링으로 풀이를 보고 넘어간다. 이게 가장 큰 문제였다. 생각하는 힘을 키워야 한다. 연습이든 실전이든 1시간 안에 접근법 조차 생각하지 못하면 그건 틀린 문제다. 1시간을 잡고 그 안에 접근법을 생각해내자. 2. 유형을 공부하지 않았다. dp, 이분탐색, 다익스트라...등등 알고리즘 유형을 공부하고 문제를 반복해서 풀기 힘들어 유형을 외면하고 그저 문제를 보고..
문제) 연속된 3개의 계단을 밟지 않고 한 번에 한 계단, 또는 두 계단을 올라 마지막 도착 계단에 도달할 때, 얻을 수 있는 총 점수의 최댓값 해결 방법) DP , 작은 하위 문제로 큰 문제를 해결한다. DP 해결 방법 1. 테이블 정하기 2. 점화식 구하기 3. 초기값 구하기 ''' 1. 테이블 정의하기 d[i]=i번째 계단을 밟을때 얻는 최대값. 2. 점화식 d[i]=d[i-1]+c[i] d[i]=d[i-2]+c[i]의 max 2. 초기값 d[0]=0 d[1]=c[1] ''' n=int(input()) c=[0] for i in range(n): x=int(input()) c.append(x) d=[0]*(n+1) d[1]=c[1] for i in range(2,n+1): d[i]=max(d[i-1..
#include #include #include using namespace std; int n;//총 n 명. n을 반반씩 나눠서 팀을 나눈다. int board[25][25]; int main() { cin >> n; for (int i = 0; i > board[i][j]; } } vector team(n); fill(team.begin() + (n / 2), team.end() , 1); int mn = 0x7f7f7f7f; do { int diff = 0; for (int i = 0; i < n-1; i++) { for (int j = i + 1; j < n; j++) { if (team[i] != team[j]..
#include #include using namespace std; int n;//시험장 개수 vector people; int b, c;//총감독관 감시 응시자수, 부감독관 감시 응시자 수 int main() { cin >> n; for (int i = 0; i > x; people.push_back(x); } cin >> b >> c; long long tot=0; for (int i = 0; i < n; i++) { if (people[i] - b
#include #include #include #include #define X first #define Y second using namespace std; int n, m; pair red, blue; // 빨간 구슬과 파란 구슬의 위치 string board[11]; // dist[a][b][c][d] : 빨간 구슬이 (a, b)이고 파란 구슬이 (c, d)에 위치한 상황에 도달하기 위한 동작의 횟수 int dist[11][11][11][11]; int dx[4] = { 0, 1, 0, -1 }; int dy[4] = { 1, 0, -1, 0 }; int bfs() { queue q; q.push({ red.X, red.Y, blue.X, blue.Y }); dist[red.X][red.Y][bl..
/* 뱀이 나와서 기어다닌다. 사과를 먹으면 뱀 길이가 늘어난다. 벽이나 자기 자신의 몸과 부딪히면 게임 끝. nxn 정사각 보드 위에서 진행. 몇몇 칸에는 사과가 놓여져 있다. 뱀의 길이는 1이다. 처음엔 오른쪽을 향한다. */ #include #include #define X first #define Y second using namespace std; int n;//보드의 크기 int k;//사과의 개수 int board[105][105]; int dx[4] = {0,1,0,-1}; int dy[4] = {1,0,-1,0}; int vis[105][105]; queue snake; queue tail; int main() { cin >> n; cin >> k; //사과의 위치 for (int i =..
#include using namespace std; int board[25][25]; int ndice[6]; int dice[6]; int dx[4] = { 0,0,-1,1 }; int dy[4] = { 1,-1,0,0 }; void go(int dir) { //동:1 서:2 북:3 남:4 switch (dir) { case 0: ndice[0] = dice[0]; ndice[1] = dice[4]; ndice[4] = dice[3]; ndice[5] = dice[1]; ndice[2] = dice[2]; ndice[3] = dice[5]; break; case 1: ndice[0] = dice[0]; ndice[1] = dice[5]; ndice[2] = dice[2]; ndice[3] = dice..
#include #include #include using namespace std; deque dq[4]; void go(int num,int dir) { int dirs[4] = {}; dirs[num] = dir; int idx = num; //왼쪽으로 전파 while (idx > 0 && dq[idx][6] != dq[idx - 1][2]) { dirs[idx - 1] = -dirs[idx]; idx--; } idx = num; //오른쪽으로 전파 while (idx < 3 && dq[idx][2] != dq[idx + 1][6]) { dirs[idx + 1] = -dirs[idx]; idx++; } for (int i = 0; i < 4; i++) { if (dirs[i] == 1) { dq[i..
/* 수와 수 사이에 끼워넣을 수 있는 n-1개 연산자 있음. n개 숫자 있음. 숫자는 변경 불가. 식의 계산은 연산자 우선 순위를 무시하고, 앞에서부터 진행되어야 한다. 나눗셈은 정수 나눗셈으로 몫만 취한다. 음수를 양수로 나눌 때는 양수로 바꾼 후 몫을 음수로 한 것. */ #include #include #include using namespace std; int n,x; int num[15]; int num_copy[15]; vector oper; int result; //차례대로 +:0 -:1 x:2 %:3 개수 int cal(int x,int y,int op) { if (op == 0) { return x + y; } if (op == 1) { return x - y; } if (op == 2..