본문 바로가기

나는 오늘,

(371)
[모의 SW 역량테스트] 수영장 문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PpFQaAQMDFAUq SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 풀이 * 완탐으로 해결 가능 => 월을 기준으로 모든 조합을 다 구한다. * 먼저 1년은 모든 월을 커버할 수 있기 때문에 최소값으로 1년 요금으로 정한다. * 1일과 1달은 '한' 달을 기준으로 보기 때문에 idx+1 로 월을 하나만 늘려주고, 3달은 idx+3으로 3달 후를 보도록 한다. 1일은 그 달에 수영장을 이용한 횟수만큼 요금을 더해주며 최소값을 구한다. #include #inclu..
[모의 SW 역량테스트] 벌꿀채취 문제 https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5V4A46AdIDFAWu 불러오는 중입니다... 풀이 * 완전 탐색 * 각 row에서 m만큼 벌통들을 보면서 최대 C이하가 되는 최적의 조합을 구해야 한다. * cost[][] 에는 현재 위치에서 m만큼 봤을 때 채취할 수 있는 벌꿀의 최대 수익을 저장한다. * 전체 맵을 순회하면서 서로 겹치지 않는 두 지점의 최대 수익의 합을 구한다. #include #include #include using namespace std; int n, m, c; int map[11][11]; int cost[11][11]; bool chk[6]; int value = 0; t..
[BOJ] 16957. 체스판 위의 공 * 체스칸 위의 적힌 값은 변동이 없기 때문에 공의 위치에 따라 이동할 방향이 정해져있다. * 이 특징을 이용해서, 좌표마다 움직이는 방향을 저장하고 (dir[][]) 해당 위치에 오면 저장된 방향으로 이동하도록 한다. * 공을 이동시킬 때는 해당 좌표에 있는 공을 모두 가지고 이동한다. #include #include #include #define INF 300001 using namespace std; //BOJ https://www.acmicpc.net/problem/16957 int r, c; int map[501][501]; int ball[501][501]; int dir[501][501]; bool visited[501][501]; int dx[9] = {-1, -1, -1, 0, 0, 0,..
[BOJ] 17298. 오큰수 * 스택을 사용한다. * 나중에 들어오는 수가 오큰수가 정해지기 때문에 스택을 이용해서 가장 최근 넣은 값과 (top) 현재 값을 비교한다. 이전 값보다 더 큰 수가 들어오면 => 이전 값 수의 오큰수는 현재 값이다. * 더 큰 수가 없으면 -1이다. #include #include #include #define MAXX 1000001 using namespace std; typedef pair pp; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; int res[MAXX]; int num[MAXX]; stack st; for (int i = 0; i < n; i++) res[i] = -1; for (int i = 0; i ..
[BOJ] 4378. 트ㅏㅊ; * 주어진 문자열을 키보드 상에서 한 칸 씩 왼쪽으로 간 결과로 치환해야 하기 때문에 키보드를 그대로 배열에 저장한다. * 문자열을 탐색하면서 문자가 탐색되면 그 인덱스 -1의 결과를 출력한다. * 인풋은 여러 줄을 나눠서 들어오고, 중간에 공백이 있을 수 있으므로 getline()으로 입력받는다. #include #include using namespace std; //boj https://www.acmicpc.net/problem/4378 int main() { ios_base::sync_with_stdio(0); cin.tie(0); string keyBoard[4] = {"`1234567890-=", "QWERTYUIOP[]\\", "ASDFGHJKL;\'", "ZXCVBNM,./"}; strin..
[BOJ] 9019. DSLR * 경로를 남기고, 역추적한다. * visited[i] = j 는 i가 되기 전의 숫자가 j임을 표시한다. op[i] = i가 되기 위한 연산을 저장한다. * a = 시작점 일 때, visited[a] = -2로 저장한다. (이 표식을 발견하면 역추적을 중지한다.) * a가 b가 되었을 때, 역추적을 하면서 벡터에 사용한 연산들을 저장한다. * a가 b가 아니라면, D ,S, L, R 연산을 진행하면서 만들어진 숫자들을 모두 큐에 넣는다. 중복 탐색을 방지하기 위해 이미 한 번 생성된 숫자는 더 이상 탐색하지 안흔ㄴ다. * 이 문제는 L, R 연산을 효율적으로 작성하는 게 중요하다. deque, string 등은 시간이 초과된다. L : d2 d3 d4 d1 이므로 가장 마지막 숫자를 추출한다. (n =..
[BOJ] 17085. 십자가 2개 놓기 * 십자가를 놓을 수 있는 최대 길이를 chk[][] 에 미리 저장을 해 놓는다. * 십자가는 한 좌표를 중심으로 상 하 좌 우 인접한 칸으로 퍼져나간다. * 이 특성을 이용해서 chk에는 몇 번이나 뻗어나갔는지를 저장한다. * dfs(int cnt, ll res) 에는 2개의 십자가를 놓았으면 최대값을 비교하여 갱신한다. (종료조건) *(0,0) ~ (n,m)까지 검사하면서 chk[][]가 1이상일 때 (== map[][] 가 # 일때) 주변을 검사하면서 십자가가 겹쳐서 생성되지 않는지 검사한다. *무조건 한 십자가가 크다고 정답이 되는 것은 아니기 때문에 십자가의 크기가 chk[][] 의 값보다 작더라도 dfs()를 호출해서 다른 십자가도 놓을 수 있도록 한다. (line 81) * visited는 ..
[BOJ] 16939. 2X2X2 큐브 https://www.acmicpc.net/problem/16939 * 큐브를 회전할 때 같이 바뀌는 인덱스들을 rotateIdx[][] 에 저장해둔다. * 한 번만 회전하는 경우 나올 수 있는 경우의 수가 6개 이고 한 번 회전할 때 바뀌는 인덱스는 8개 이므로 6*8 로 생성했다. *큐브의 현재 상태를 저장하는 것이 중요하다. * rotate()에는 큐브를 회전하고 check()를 통해 회전한 결과가 옳은지 확인한다. * deque를 사용해서 정방향으로 돌릴 때는 뒤에 값을 넣어주고, 역방향으로 돌릴 때는 앞에 값을 넣어준다. deque의 결과는 다시 큐에 넣고, check()에서 결과를 확인한다. #include #include #include #include using namespace std; ..