출처 : https://school.programmers.co.kr/learn/courses/30/lessons/340212 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 아이디어요구사항 파악을 통한 알고리즘 선택'퍼즐의 난이도를 순서대로 담은 1차원 배열 diffs...'입력 자료(탐색 배열)의 순서가 일정하다는 사실을 발견할 수 있다. 다시 말해, 입력 자료의 안정성이 충족된다고 해석 가능하다.'정답 변수인 숙련도(Level)을 탐색 배열에서 랜덤하게 선택할 수 있는가?'Yes! 숙련도 값을 하나하나 대입해서 탐색 및 비교해야하므로, 랜덤하게 선택할 수 있다. 예를 들어, 초기 숙련도를 10으로 ..
https://www.acmicpc.net/problem/1932 아이디어이번 문제는 결론적으로는 dp로 접근해야 한다. 실버 등급의 문제이지만, dp에 대한 개념을 정확히 알아야 접근 가능하다. dp 접근까지 필자의 사고 과정을 통해 문제 해결 과정을 살펴보는 것을 추천한다. 이제 차근차근 알아보자. 1번째 접근 : 그리디(Greedy)경로 길이의 최댓값을 요구하는 문제이므로, 가장 먼저 그리디를 떠올렸다. 정수 삼각형을 트리로 생각하여, 다음의 가설을 세웠다.'각 레벨에서 최댓값을 선택해나가는 방법'즉, 지역적 답들을 선택해나가 전역답과 근사한지를 체킹하는 것이 필요하다. 그러나, 다음 사진과 같은 문제점을 발견하였다.레벨 2에서의 지역 최댓값은 8이고, 레벨 3에서의 최댓값도 8이다.그러나, 이..
출처 : https://www.acmicpc.net/problem/14248 아이디어해당 문제는 그래프 탐색 유형으로 분류할 수 있으며, '점프를 해나가는 과정'의 의미를 파악하면 쉽게 해결할 수 있다. 예제를 통해, 그 의미를 살펴보자.예제 입력 1번 케이스를 기준으로, 3번돌의 다음 방문 돌을 오른쪽으로 간다고 가정해보자. 이 때, 돌의 방문 순서는 다음과 같다.3번돌 -> 5번돌 -> 4번돌 -> 2번돌 -> 방문불가(범위초과)이는 함수로써 다음과 같이도 쓸 수 있다.f(3) -> f(f(3)) -> f(f(f(3))) -> f(f(f(f(3)))) -> 방문 불가즉, '점프를 해나가는 과정'은 '재귀 함수'와 동일하다. 이를 토대로, 우리는 그래프로 다음과 같이 시각화할 수 있다.그래프 정의는 ..
출처 : https://www.acmicpc.net/problem/1863 아이디어먼저, 해당 문제의 요구사항을 파악해보자.좌표의 의미입력 데이터 (x,y)는 열 x번에 행 0 ~ y-1까지의 높이를 나타낸다.건물의 개수건물의 높이를 나타내는 y가 같은 열들은 모두 하나의 건물로 해석할 수 있다. 이를 통해, 알고리즘을 설계해보자.완전 탐색2차원 행렬에 건물의 모든 좌표를 저장하고, 행을 순차적으로 탐색하여 직사각형을 찾는 과정이다. 이 때, 발견된 직사각형의 좌표들은 방문처리를 진행해준다. 즉, 직사각형 탐색 시 현재 탐색 행의 모든 좌표들 중에 1개라도 방문하지 않은 좌표가 존재한다면, 직사각형으로 처리한다는 것이다.그러나, 완전 탐색은 다음과 같은 문제점들이 존재하므로, 해당 문제에서는 적용할 수..
출처 : https://www.acmicpc.net/problem/17141 아이디어'상하좌우로 인접한 모든 빈칸으로 동시에 복제'해당 요구사항을 통해, 동시에 인접한 칸들로 복제되므로 BFS 그래프 탐색 유형임을 알 수 있다. 그렇다면, 이를 토대로 구현에 필요한 핵심 인사이트들을 파악해보자. 바이러스가 모든 빈 칸들에 복제되었는지 어떻게 판단할까?모든 빈 칸들이 복제되었는지에 대한 여부를 판단해야하므로, 빈 칸 카운팅이 필요하다는 것을 알 수 있다. 즉, BFS 탐색 전의 빈칸들 상태와 탐색 후 빈칸들 상태를 같은지 비교하면 된다.이를 위해 다음 2가지 카운팅 변수를 설정해야 한다.Total_blank : 초기 연수소의 빈칸(0)의 개수들을 카운팅 + 바이러스 후보 칸들(2)State_blank :..
출처 : https://www.acmicpc.net/problem/2800 아이디어해당 문제에서 구하자고자 하는 인사이트는 다음과 같다.'특정 괄호 쌍을 제거하는 모든 경우의 수를 구한다.'브루트포스의 문제이므로, 괄호 제거에 대한 모든 경우의 수를 파악하기 전에 올바른 괄호 쌍이 어떻게 되는지 먼저 파악해야 한다. 다시 말해, 올바른 괄호 쌍의 인덱스 튜플을 알기만 하면, 괄호 제거의 경우들을 파악할 수 있다.그렇다면, 어떻게 올바른 괄호 쌍들의 인덱스를 저장할 수 있을까? Stack을 이용하면 쉽게 해결 가능하다. 왼쪽 괄호( '(' )를 스택에 삽입하고, 오른쪽 괄호( ')')를 조회 시 스택에서 pop을 하여 저장하면 된다.이해를 돕기 위해 다음의 예제를 확인하길 바란다. 이렇게, 올바른 쌍들의..