목록Programmers (15)
소소한 개발이야기
📄 다트 게임 🔗 문제 풀러가기 문제는 문자열과 스택의 개념을 이용하여 해결하였습니다. 문제의 조건이 생각보다 많아서 잘 정리하며 문제 풀이를 해야합니다. 먼저 문제의 조건을 살펴보겠습니다. 문제 조건 다트 게임은 총 3번의 기회로 구성된다. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다. 각 점수마다 보너스가 주어진다(S, D, T) 옵션 스타상과 아차상이 주어지며 각 옵션은 중첩이 가능하다. 스타상 : 해당 점수와 이전 점수를 각 2배로 만든다.(첫 번째 기회에도 나올 수 있다.) 아차상 : 해당 점수는 마이너스가 된다. 보너스는 각 점수마다 존재하지만 옵션은 존재하지 않을 수 있다. 옵션은 둘 중 하나만 존재할 수 있다. 입력은 점수 | 보너스 | [옵션] 으로 주어진다. 문제 풀이 먼저..
📄 위장 🔗 문제 풀러가기 문제는 HashMap을 이용해 해결하였습니다. 문제의 의도는 도둑이 가진 옷의 이름과 옷의 종류(category) 가 주어지고, 여기서 도둑이 입을 수 있는 옷의 경우의 수를 구하는 문제 입니다. 문제의 조건을 보면 다음과 같습니다. 매일 입는 옷은 달라야 한다. 옷을 입거나 안입는 경우도 있다. 적어도 1개 이상의 옷은 입어야 한다. 처음 문제를 접근할 때 방향을 잘 잡아야 하는데 문제를 천천히 읽어보면 옷의 이름은 중요하지 않습니다. 문제에서 가장 중요한 부분은 옷의 종류별 갯수 입니다. 예제를 보면서 천천히 설명해보겠습니다. 예제 1 상의 : 반팔, 긴팔 하의 : 청바지, 반바지, 슬랙스 위의 예제를 보면 상의 2개, 하의 3개입니다. 문제에서 제시하는 것은 도둑이 어떤 ..
📄 비밀지도 🔗 문제 풀러가기 문제는 2진수의 OR연산을 이용해 해결하였습니다. 문제의 조건을 살펴보면 2개의 지도가 주어지는데 벽(#) 또는 공백으로 이루어져 있습니다. 예시에서 친절하게 2진수로 나타낼 수 있다고 알려주고 있습니다. 그렇다면 2개의 지도를 겹쳐 두 지도에서 모두 공백인 부분을 찾아내는 것이 목표인데 OR연산을 이용하면 쉽게 문제를 해결할 수 있습니다. 다만 문제의 입력이 2진수가 아닌 10진수로 주어지기 때문에 이를 2진수로 변경해야지 문제를 해결할 수 있습니다. 직접 변경해도 되지만 JAVA에서 10진수를 2진수로 변경시킬 수 있는 함수 Integer.toBinaryString을 활용해 문제를 해결할 수 있습니다. 주의사항 문제에서 주어지는 지도는 n x n 이지만 10진수를 2진수..
📄 가장 큰 수 🔗 문제 풀러가기 문제는 문자열의 정렬을 이용하여 해결하였습니다. 가장 큰 수를 만드는 방법은 가장 큰 수가 앞으로 오면 됩니다. 여기서 가장 큰 수는 0 ~ 9 중 가장 큰 수를 말합니다. 즉, 30 보다는 9가 앞으로 와야지 더 큰 수가 되는 것입니다. 처음 문제를 접근 할 때에는 그냥 문자열 정렬을 한 뒤 모든 수를 이어 붙이면 가능할거라 생각했지만 함정이 존재 했습니다. 아래는 문제의 예제중 하나 입니다. 예제 1 (3, 30, 34, 5, 9) 여기서 단순 문자열 정렬을 한다면 아래와 같은 순서로 정렬이 됩니다. (9, 5, 34, 30, 3) 이대로 이어 붙인다면 9534303이라는 결괏값이 나오게 되는데 문제의 정답은 9534330입니다. 즉 단순 정렬이 아니라 정렬의 조건을..
📄 전화번호 목록 🔗 문제 풀러가기 문제는 String 배열만을 사용해서 해결하였습니다. 먼저 이번 풀이는 제가 처음 접근했던 방법들과 접근하던 도중 발생했던 오류(런타임 에러) 에 대한 개인적인 생각과 해결과정을 함께 포함시켜 풀이를 해보겠습니다. 최종 소스코드만 보고싶으신 분들은 최종 소스코드만 보기를 클릭하셔도 됩니다. 글의 순서는 다음과 같습니다. 첫 번째 접근 방식과 에러 두 번째 접근 방식과 에러 런타임 에러가 발생하는 이유(개인적인 생각) 런타임 에러를 해결한 방법(최종 소스코드) 첫 번째 접근 방식 첫 번째로 접근했던 방법은 HashMap을 이용해서 문제를 접근하였습니다. 모든 전화 번호 목록을 Map에 입력 후 검사 대상인 전화번호를 제외하고 Map의 모든 값들을 확인하였습니다. 확인하는..
📄 더 맵게 🔗 문제 풀러가기 문제의 접근은 Min-Heap을 이용해 해결할 수 있습니다. 문제의 조건을 보면 주어진 원소들 중 가장 작은 값 과 두 번째로 작은 값 을 연산하여 새로운 값을 생성 합니다. 여기서 새로운 값이 항상 작다는 보장이 없습니다. 따라서 새로운 값을 생성한 뒤 다시 오름차순으로 정렬을 해야합니다. Min-Heap을 이용하면 가장 작은 작은 값이 항상 맨 앞에 있으므로 문제를 푸는데 쉽게 접근할 수 있습니다. 문제의 풀이 순서는 다음과 같습니다. Java에서 문제의 풀이는 PriorityQueue를 사용하였습니다. 주어진 모든 원소(scoville)를 우선선위 큐에 넣는다 첫 번째 원소의 값이 K값 이상인지 확인한다. K값 이하일 경우 첫 번째 원소와 두 번째 원소를 꺼내 새로운 ..
📄 쇠막대기 🔗 문제 풀러가기 스택을 이용해서 문제를 해결 할 수 있습니다. 처음 문제를 접했을 때 쇠막대기가 끝나는 시점에서 해당 쇠막대기가 포함하고 있는 레이저만큼 조각을 생성하는 방법을 생각하였습니다. 하지만 이렇게 접근하다 보니 겹쳐 있는 쇠막대기에 대해 처리해야 할게 너무나 많아져 간단하게 처리 할 방법을 생각하였습니다. 문제의 풀이 방식은 아래와 같습니다. 먼저 레이저가 나오면 무조건 지금까지 쌓인 쇠막대기 만큼의 조각이 생깁니다. 따라서 레이저가 나오면 스택에 있는 쇠막대기의 개수 만큼 조각을 추가 해줍니다. 문제의 예시에서 첫 번째 레이저를 만났을 때를 가정해본다면 다음과 같습니다. "(((()" 이렇게 첫 번째 레이저를 만나게 된다면 총 3개의 조각이 무조건 생기게 됩니다. 그 다음 레이..
📄 기능개발 🔗 문제 풀러가기 문제의 조건을 살펴보면 모든 작업은 동시에 개발 됩니다. 하지만 이전의 작업이 마무리 되지 않으면 현재 작업은 이전의 작업이 마칠때 까지 기다려야 합니다. 즉, 모든 작업은 순서대로 이루어 진다고 볼 수 있습니다. 따라서 모든 작업을 Queue에 넣고 Queue의 가장 첫 번째 작업이 끝났다면 Queue에서 제거 한 뒤 다음 작업들 중 동시에 끝낼 수 있는 작업도 같이 Queue에서 제거해주면 됩니다. 문제 풀이 접근 순서는 다음과 같습니다. 작업의 정보(현재 진행률, 진행속도)를 Queue에 넣는다. Queue가 비기 전까지(모든 작업이 끝날 때까지) 작업들을 진행 시킨다. 만약 Queue의 가장 첫 번째 작업(선행작업)이 종료 되었다면 Queue에서 제거한다. 선행작업 ..