대표적인 스택 활용 문제이다. 두시간을 왜 틀렸는지도 모른채 끙끙 앓았다. 결국 대회 테스트 케이스까지 가져다가 일일히 대입해서 반례를 찾기는 했는데, 결과값이 워낙 길다보니 텍스트 비교 사이트를 활용해가며 고민한 결과 문제점을 결국 알아냈다.. 내가 떠올린 풀이법의 큰 틀은 다음과 같다. 1. 폭탄문자열의 각 문자와 그 문자의 인덱스를 맵으로 저장한다. 2. 주어진 문자열에서 한문자씩 반복하여 체크한다. 3-1. 그 문자가 폭탄문자열에 속해있지 않으면 정답 큐에 해당 문자를 넣는다. 3-2. 그 문자가 폭탄문자열에 속해있다면 그 문자의 인덱스를 가져온다. 4-1. 가져온 인덱스가 0이면 묻지도 따지지도 않고 count 스택에 넣는다. 4-2. 가져온 인덱스가 스택 상단의 인덱스보다 1크다면 스택 상단의..
BFS 연습문제로 풀게된 '루머' 문제이다. https://www.acmicpc.net/problem/19538 19538번: 루머 예제 1 0분 : 최초 유포자($1$, $6$번 사람)가 루머를 생성한다. 1분 : $1$번 사람은 $2$, $3$번 사람에게 루머를 퍼뜨린다. $2$번 사람은 주변인 $2$명 중 $1$명이 루머를 믿고 있어 루머를 믿게 된다. $3$ www.acmicpc.net 복잡한 문제지만, 보자마자 BFS를 떠올리는 것은 어렵지 않았다. BFS의 연습문제인 바이러스, 연구소 문제와 닮았다. 중간에 체크해야 하는 조건 하나가 추가되어서 귀찮은 것이 이 문제가 골드인 이유일 것이다. 내가 떠올린 아이디어는 러프하게 이 문제의 풀이과정을 그대로 따라가는 것이었다. 나는 파이썬에서 덱으로 ..
인턴으로 들어와서 하게된 프로젝트 이번에 새로 신입으로 오신 다른 직원분과 둘이서 팀프로젝트로 하게 되었다. '자동 메일 송신 프로세스 만들기' 프로젝트에 대해 정리하고자 한다. 이 프로젝트의 순서도는 다음과 같다. 결국 이 프로젝트의 목적은 알림을 메일로 보내는 것이다. 중요한 것은 3가지이다. 1. 어떤 내용을 보낼 것인가 (알림 내용 리스트) 2. 언제 보낼 것인가 (알림 전송 시간) 3. 누구에게 보낼 것인가 (알림 수신자) 이 내용을 사용자가 입력하여 데이터베이스에 저장해둔다. 배치프로그램은 데이터베이스에 저장된 내용을 토대로 알림 전송 목록을 만든다 일종의 (내용, 시간, 수신자) 의 조합쌍을 만드는 것이다. 그리고 이 조합쌍들의 목록을 메일 전송 배치프로그램이 실제 메일을 전송하도록 만든다...
https://www.acmicpc.net/problem/20500 20500번: Ezreal 여눈부터 가네 ㅈㅈ 문제의 답을 $1\,000\,000\,007$로 나눈 나머지를 출력한다. www.acmicpc.net 초급 알고리즘 DP 강의를 수강 후 연습문제로 풀게된 문제이다. 문제는 간단하다 1과 5로 이루어진 N자리 수 중 15의 배수를 구하는 문제이다. 어떻게하면 이 문제를 DP를 활용하여 구할 수 있을까? 아무런 아이디어가 떠오르지 않았다. 그래서 그냥 무작정 써봤다. 1자리수 1, 5 0개 2자리수 11, 15, 51, 55 1개 3자리수 111, 115, 151, 155, 511, 515, 551, 555 근데 3자리수를 쓰고보니 15의 배수가 한눈에 안보인다. 일일히 나눠보는 생각을 했지만..
중급 알고리즘 - 그리디 수강 후 연습 문제로 풀게된 문제이다. https://www.acmicpc.net/problem/2878 2878번: 캔디캔디 첫째 줄에 M(1 ≤ M ≤ 2×109)와 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 친구들이 받고 싶어하는 사탕의 개수가 주어진다. 이 개수는 2×109보다 작으며, 친구들이 받고 싶어하는 www.acmicpc.net 친구들에게 사탕을 나눠줘야하는데 사탕은 반드시 모자라다. 내가 원하는 사탕이 10개인데, 사탕을 5개만 받았다면 그 친구는 못받은 사탕개수의 제곱만큼 분노하게 된다. (분노치 5*5 = 25) 각 친구들의 분노치 합을 최소로 만드는 문제이다. 이제부터 내가 이 문제를 풀기까지 사고한 과정을 정리하고자 한다..
https://www.acmicpc.net/problem/5520 5520번: The Clocks Read nine numbers from the standard input. These numbers give the start positions of the dials. 0=12 o'clock, 1=3 o'clock, 2=6 o'clock, 3=9 o'clock. The example in figure 1 gives the following input data file: www.acmicpc.net 백준 5520 The Clocks 문제이다. Figure 1과 같이 3x3 배열로 시계들이 있다. 우리의 목표는 모든 시계를 12시 정각을 가리키도록 최소한의 횟수로 돌리는 것이다. 시계를 돌리는 방법은 Fig..
냅색 문제를 공부하고나서 도전했던 문제이다. 스스로 아이디어를 찾는데에 실패해서 결국 검색을 통해 해결했지만, 이 문제를 통해 얻어갈 수 있는 부분이 있었기에 정리하고자 한다. 어떤 앱을 실행시키기 위해서 추가로 M의 메모리를 확보해야 하는 상황이다. 따라서 이 메모리를 확보하기 위해 기존에 실행 중이었던 앱을 끄고자 한다. 실행 중인 앱을 한번 끄면 다시 키는데 드는 시간 등 추가 비용이 발생하게 된다. 이 비용을 수치화 할 수 있다고 가정하면 실행 중이던 어떤 앱을 껐을 때 얻을 수 있는 메모리가 m, 발생하는 비용이 c로 정해진다. 이제 N개의 앱이 주어진다. 각각의 앱마다 m, c 의 값을 갖는다. 이 문제는 M이상의 메모리를 확보하기 위해 필요한 최소 비용을 구하는 것이다. 아직 냅색문제가 익숙..
동아리에서 DP를 배우면서 과제로 푼 '이진수 찾기'의 풀이 과정을 정리하고자한다. 처음에 문제를 딱 읽었을 때는 무슨 말인지 긴가민가 했다. 직접 써보면 간단하다. 만약 3자리 이진수 중, 2개 이하의 비트만 1인 것을 크기순으로 나열하면 다음과 같다. 000 001 010 011 100 101 110 이제 주어진 조건하에서 주어진 숫자 번째의 이진수를 찾아야한다. 처음에는 어떻게 풀어야할지 감이 안왔다. 그래서 예제 입력 1번 5 3 19 크기순으로 직접 나열해봤다. 00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 01010 01011 01100 01101 01110 10000 . . . 근데 여기까지 쓰고보니 뭔가 규칙이 보인다. 위 사진처..
다른 사람의 코드를 보고 아이디어를 얻었음에도 구현을 정확하게 하지 못해 결국 질문게시판의 반례 코드를 보고 해결한 문제. '과제'를 풀면서 깨달은 것을 정리해보고자 한다. 과제의 문제 설명 자체는 간단하다. 마감일, 과제 완료시 얻는 점수에 대한 정보가 과제 수만큼 주어진다. 이제 남은 기간동안 효율적으로 최대한의 점수를 얻기만 하면 된다. 나는 당연히 첫날부터 과제를 어떻게 선택하는 것이 좋은지에 대해 고민했다. 점수가 가장 높은 순으로 고르는 것이 제일 먼저 떠올랐다. 그리고 반례도 바로 떠올랐다 ㅋㅋ 3 30 2 20 1 10 최대값은 60이지만, 점수가 높은 순으로 뽑았다가는 50밖에 얻지 못한다. 그렇다면 마감일이 빠른 순으로 뽑으면 되는가? 과제 문제의 예시 입력을 보면 하루 남은 과제는 아..
아무리 고민해봐도 해답을 알 수 없었던 문제였던 난로 문제에 대해 정리해보고자 한다. (결국 다른 사람의 아이디어를 참고하여 내 나름대로의 방법으로 풀었다) 당연히 처음에 떠올렸던 풀이는 시간 간격별로 잘라서 비교하는 것이었는데, 처음에는 그 방법으로 풀 수 없다고 생각했다. 단순히 인접한 친구의 방문 시간 간격이 길 수록 성냥을 먼저 쓴다고 생각하기에는 그렇게 소비한 성냥 때문에 오히려 더 많은 시간에 난로를 지펴야 하는 것 아닌가 하는 생각을 했다. 사실 문제를 풀면서 계속 헷갈렸던 것이, 친구가 올 때까지 난로를 핀다는 이상한 생각에 계속 사로잡혀 있었다. 가령 다음과 같이 친구가 방문을 하는 상황에 성냥이 2개 있다고 하자. 최적해의 알고리즘대로라면 '10' 시간에 방문하는 친구가 올 때 난로를 ..