문제3x3 퍼즐판이 주어졌을 때, 퍼즐판의 알파벳을 사용하여 만들 수 있는 단어의 수를 알파벳별로 계산하고, 단어 수의 최솟값과 최댓값에 해당하는 알파벳을 출력하는 문제이다.풀이퍼즐의 알파벳들과 각 단어의 알파벳들의 비교하여 만들 수 있는 단어인지 파악하고, 퍼즐의 각 알파벳이 총 몇 개의 단어를 만드는데 사용될 수 있는지 세면 최솟값과 최댓값을 구할 수 있다.먼저 단어 사전의 단어들의 알파벳 빈도 딕셔너리로 변환하여 저장한다. (중복 값이 있을 수 있음을 고려) 퍼즐 정보를 하나씩 받으면서 퍼즐의 알파벳 빈도 딕셔너리를 생성한다.단어 사전의 단어들과 퍼즐을 비교하여 퍼즐을 통해 만들 수 있는 단어인지 확인한다.퍼즐 알파벳의 빈도가 단어 알파벳의 빈도보다 작으면 만들 수 없는 단어이다.만들 수 있는 단어..
문제1부터 N까지의 정수로 이루어진 순열을 오름차순으로 정렬할 때, 최소 몇 번의 뒤집기를 해야 하는지 구하는 문제이다.정렬은 특정 위치 iii에서 시작하여 오른쪽으로 K개의 숫자를 뒤집는 연산을 반복하는 방식으로 이루어진다. 예를 들어 N이 5, K가 3일 때, (5, 4, 3, 2, 1) 순열이 주어진 경우i=0에서 뒤집으면 (3, 4, 5, 2, 1) 이 된다.i=1에서 뒤집으면 (3, 2, 5, 4, 1) 이 된다.i=2에서 뒤집으면 (3, 2, 1, 4, 5) 이 된다.i=0에서 뒤집으면 (1, 2, 3, 4, 5) 이 되면서 정렬이 완료된다.최소 4번의 뒤집기로 오름차순 순열을 만들 수 있다.풀이이 문제는 각 순열 상태를 노드로 보고, 한 번의 뒤집기로 다른 상태로 이동하는 최단 경로 탐색 문..
Python으로 개발을 한다면 PyCharm은 매우 유용한 IDE 이다. 다양한 기능과 편의성 덕에 많은 개발자들이 사용한다.더 효율적으로 개발을 하고 싶다면 단축키를 사용해 보는 것을 추천한다.단축키를 사용한다면 자주 쓰는 기능들에 쉽게 접근할 수 있음으로 개발 속도가 크게 향상될 수 있기 때문이다. 1. 파일 탐색 및 편집① 프로젝트 뷰 열기Alt + 1 (Windows/Linux), Command + 1 (macOS)프로젝트 뷰를 빠르게 열고 닫을 수 있어 필요할 때 프로젝트 구조를 빠르게 확인하거나 창을 닫아 코드를 넓게 확인할 수 있다.② 파일 열기Ctrl + Shift + N (Windows/Linux), Command + Shift + O (macOS)열고 싶은 파일의 이름 일부만 알고 있다..
문제정수를 십진수로 표현할 때, 각 자리수가 왼쪽에서 오른쪽으로 감소하는 줄어드는 수 중 n번째로 작은 줄어드는 수를 구하는 문제이다.예를 들어 54321나 654는 줄어드는 수이며, 544나 324은 줄어드는 수가 아니다. 풀이BFS로 n번째 작은 수까지의 모든 경우의 수를 찾아 정답을 도출 할 수 있다.BFS를 사용하는 이유는 작은 수부터 순차적으로 줄어드는 수를 생성하므로, 추가적인 정렬 없이도 오름차순으로 n번째 줄어드는 수를 찾을 수 있기 때문이다.먼저 한 자리수 (0~9)를 큐에 넣는다.큐에서 줄어드는 수를 꺼내어 해당 숫자가 n번째 줄어드는 수라면 탐색을 멈추고 결과를 반환한다.아니라면, 1의 자리보다 작은 숫자를 뒤에 추가해 새로운 줄어드는 수를 생성한다.만약 n번째 줄어드는 수가 없다면 ..
문제주어진 금액을 만들기 위해 동전 종류에 따라 거스름돈을 주는 방법의 수를 구하는 문제이다.풀이동적 프로그래밍(DP)을 사용해 풀 수 있다. 특정 금액 n을 만들기 위한 방법의 수를 누적해서 계산한다. 이때 작은 동전(금액)부터 시작해 큰 동전에 대해 가능한 경우의 수를 차례로 계산한다. dp[0]은 항상 아무 동전도 쓰이지 않는 방법 한 가지만 존재함으로 dp[0]=1로 지정한다. 현재 금액 x를 만들기 위한 방법의 수는 x - coin을 만들 수 있는 방법의 수에 현재 동전 coin을 추가한 것이다. 이를 토대로 점화식을 구성하면 dp[x] = dp[x] + dp[x-coin] 이 된다. 마지막 정답을 도출할 때는 숫자가 매우 커질 것을 방지해 1000000007로 나눈 나머지를 반환한다.Pytho..
문제게임 보드 위의 숫자에 따라 동전을 이동시킬 때, 동전을 움직이는 횟수가 최대가 되도록 하는 문제이다.보드 위의 숫자는 1부터 9까지 있으며, 해당 칸에서 다음 칸으로 이동할 때 표기된 숫자만큼 한 번에 이동해야 한다.동전은 상하좌우로 이동할 수 있고, H(구멍) 칸이나 보드 바깥으로 이동되면 게임이 종료된다.풀이이 문제에서는 깊이 우선 탐색(DFS)과 메모이제이션, 백트래킹을 사용해 풀 수 있다.재귀적으로 DFS를 사용해서 동전이 이동할 수 있는 모든 경로를 탐색한다.메모이제이션 DFS 탐색을 하면서 특정 칸에 대한 경로 탐색이 끝나면, 그 칸에서 최대 이동 횟수를 계산한 상태이다.따라서 중복 탐색을 방지하기 위해, 계산된 값을 메모이제이션을 통해 저장한다.탐색 도중 이미 계산된 값( dp[x][y..
테스트 드리븐 개발(TDD)은 요구사항을 명확히 하고 안정적인 코드를 작성하는 개발 방법이다.제일 먼저 예상되는 동작에 대한 테스트 코드를 작성하고, 구체적으로 기능을 구현하는 것이다.장고에서는 테스트 드리븐 개발(TDD)을 쉽게 할 수 있도록 지원하고 있다.기본적인 장고의 TDD 개발 과정에 대해 뷰 테스트를 예를 들어 설명하려 한다.1. 테스트 계획 및 작성요구사항을 정리하여 개발해야하는 기능을 계획한다.요구사항에 맞는 테스트 코드를 작성한다.장고에서는 TestCase 클래스를 상속받아 사용자 정의 테스트 코드를 작성할 수 있다.아래 코드는 도서 데이터를 가져오는 API를 테스트하는 예제이다.# api/test.pyfrom django.test import TestCasefrom rest_framew..