✔ 석유 시추 [프로그래머스 250136] 문제 분석하기 BFS를 이용해 상하좌우로 탐색하며 석유 덩어리들이 차지하는 y 좌표에 덩어리들의 크기를 저장 이후 y 좌표에 대한 석유 덩어리들을 모두 합하도록 함 손으로 풀어보기 BFS를 이용해 상하좌우로 탐색하며 석유 덩어리들이 차지하는 y 좌표에 덩어리들의 크기를 저장 y 좌표에 대한 석유 덩어리들을 모두 합하도록 함 슈도코드 작성하기 land(석유가 묻힌 땅과 석유 덩어리를 나타내는 2차원 정수 배열) answer(시추관 하나를 설치해 뽑을 수 있는 가장 많은 석유량) dx, dy(상하좌우 좌표) oils(각 열에 대한 석유량을 담은 배열) for(x -> land의 길이만큼) { for(y -> land[0]의 길이만큼) { if(빈 땅이라면) 넘어감 ..
✔ 아날로그 시계 [프로그래머스 250135] 문제 분석하기 초침이 한 바퀴 돌 때 분침과 시침과 만나는 횟수를 세도록 함 이를 이용해 끝나는 시간까지 몇 번 알람이 울리는지 - 시작 시간 전까지 몇 번 알람이 울리는지 계산하고 시작(현재) 시간에 알람이 울리는지 계산하도록 함 손으로 풀어보기 초침이 한 바퀴 돌 때 분침과 시침과 만나는 횟수를 세도록 함 이를 이용해 끝나는 시간까지 몇 번 알람이 울리는지 - 시작 시간 전까지 몇 번 알람이 울리는지 계산 슈도코드 작성하기 h1, m1, s1(시작 시간) h2, m2, s2(종료 시간) answer(알람이 울리는 횟수) answer = countAlarm(h2, m2, s2) - countAlarm(h1, m1, s1) if(시작 시간이 정각이라면) 종료..
✔ 요격 시스템 [프로그래머스 181188] 문제 분석하기 시작 좌표와 끝 좌표에서는 요격할 수 없으므로 그 사이의 좌표를 증가시키며 다른 좌표까지 같이 요격할 수 있는지 확인하도록 함 같이 요격할 수 없다면 미사일의 개수를 증가시키도록 함 손으로 풀어보기 요격이 끝나는 시간인 e, 요격이 시작되는 시간인 s를 기준으로 정렬 하나의 미사일이 여러 미사일을 요격하기 위해 미사일의 위치를 끝나는 시간으로 설정하고 다른 미사일도 함께 요격할 수 있는지 확인 함께 요격할 수 없는 미사일이라면 미사일을 하나 추가하고 위를 반복 슈도코드 작성하기 targets(각 폭격 미사일의 x 좌표 범위 목록) answer(모든 폭격 미사일을 요격하기 위해 필요한 요격 미사일 수) e를 기준으로 오름차순 정렬, 같을 경우 s를..
✔ 두 원 사이의 정수 쌍 [프로그래머스 181187] 문제 분석하기 1, 2, 3, 4분면의 공간에 다 같은 점의 개수가 존재하게 되므로 한 분면의 개수를 구하여 4만큼 반환하도록 함 이때 작은 원의 올림만큼, 큰 원의 내림만큼 점이 존재할 수 있으므로 이를 이용 손으로 풀어보기 작은 원의 올림만큼, 큰 원의 내림만큼 점이 존재할 수 있으므로 이를 이용해 한 분면의 개수를 구함 한 분면의 4배를 반환 슈도코드 작성하기 r1, r2(반지름) answer(두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수) for(x -> 1부터 r2까지) { minY(x에 대한 최소 Y 값) = Math.sqrt(1.0 * r1 * r1 - 1.0 * x * x)의 올림 값 maxY(x에 대한 최대 Y 값) ..
✔ 연속된 부분 수열의 합 [프로그래머스 178870] 문제 분석하기 투 포인터를 이용해 두 포인터 사이의 원소의 합이 k일 경우를 찾도록 함 이때 k인 부분 수열이 여러 개인 경우 길이가 짧은 수열을 찾고, 길이가 같을 경우 먼저 탐색한 수열을 우선으로 하도록 함 손으로 풀어보기 투 포인터를 이용해 두 포인터 사이의 원소의 합이 k일 경우를 찾음 이때 k인 부분 수열이 여러 개인 경우 길이가 짧은 수열을 찾음 길이가 같을 경우 먼저 탐색한 수열을 우선으로 하도록 함 슈도코드 작성하기 sequence(수열을 나타내는 정수 배열) k(부분 수열의 합을 나타내는 정수) answer(조건을 만족하는 수열의 시작 인덱스와 마지막 인덱스) start(시작 인덱스) end(마지막 인덱스) sum(부분 수열의 합) ..
✔ 과제 진행하기 [프로그래머스 176962] 문제 분석하기 과제를 시작 시간을 기준으로 정렬한 후, 스택을 사용해 먼저 시작한 과제부터 끝낼 수 있도록 함 손으로 풀어보기 과제를 시작 시간을 기준으로 정렬 현재 과제의 종료 시간이 다음 과제의 시작 시간보다 늦다면 현재 과제의 진행 시간만큼 뺀 후 스택에 넣도록 함 이를 이용해 먼저 시작한 과제부터 끝낼 수 있도록 함 만약 중지한 과제가 있다면 최근 과제부터 다음 과제의 시작 시간 전까지 반복하도록 함 또한 과제와 과제 사이의 시간이 남는다면 중지한 과제를 진행하도록 함 과제를 끝낸 순서대로 이름을 담아 반환 슈도코드 작성하기 plans(과제 계획을 담은 이차원 문자열 배열) answer(과제를 끝낸 순서대로의 이름) 시작 시간으로 기준으로 plans을..
✔ 광물 캐기 [프로그래머스 172927] 문제 분석하기 광물을 5개씩 선택하며 곡괭이에 따른 피로도를 계산하도록 함 이후, 이 피로도와 남은 곡괭이의 갯수에 따라 가장 적은 피로도를 가질 수 있도록 함 손으로 풀어보기 광물을 5개씩 선택하며 곡괭이에 따른 피로도를 계산 각 피로도와 남은 곡괭이의 갯수에 따라 가장 적은 피로도를 가질 수 있도록 함 슈도코드 작성하기 picks(갖고 있는 곡괭이의 개수) minerals(광물들의 순서) answer(최소한의 피로도) arr(곡괭이와 광물에 따른 피로도 배열) list(곡괭이에 따른 광물들의 피로도를 담은 리스트) 각 곡괭이에 따른 피로도 계산하기 함수(picks, minerals) 곡괭이 선택하기 함수(picks) answer 반환 각 곡괭이에 따른 피로도..
✔ 리코쳇 로봇 [프로그래머스 169199] 문제 분석하기 상하좌우를 BFS를 하며 탐색하며 장애물을 만날 때까지 이동하면서 목표위치에 도달할 수 있는지 확인함 손으로 풀어보기 상하좌우를 BFS를 하며 탐색하며 이동 횟수 증가 이때 장애물을 만날 때까지 이동하는 것을 한 번의 이동으로 함 목표 위치에 도달할 수 있다면 이동 횟수를, 도달할 수 없다면 -1을 반환 슈도코드 작성하기 board(게임판의 상태) answer(최소 이동 횟수) dx, dy(상하좌우 좌표) visited(방문 유무 배열) for(i -> board의 길이만큼) { for(j -> board[0]의 길이만큼) { if(board[i].chartAt(j)가 R이라면) answer = bfs(board, i, j) } } answer ..