목록알고리즘 (547)
N
파일명을 head, number, tail로 나누고 1. head의 오름차순으로 정렬 2. head가 같다면 number의 오름차순으로 정렬 3. head, number가 같다면 들어온 순서대로 정렬 을 진행해야 한다. 우선 head와 number를 나누도록 한다. hc는 head check, nc는 number check로 각각 head와 number가 나눠졌는지 확인하기 위한 bool형 변수다. 이중for문을 이용하여 files[i][j]가 '0' ~ '9'가 아닌 부분은 head로 넣어준다. hc == false라면 아직 head 부분이므로 소문자로 바꿔준 후, 넣어주도록 한다. '0'~'9'라면 head부분은 끝났기 때문에 hc = true로 바꿔주고, 해당 부분은 number에 더해준다. hc ..
큐와 맵을 이용하여 문제를 푼다. 우선 string을 담을 수 있는 큐인 q와 map m을 선언한다. 그리고 보석 종류의 개수를 구하기 위한 gems_size, 진열대 시작 번호 start, 진열대 마지막 번호 end, 시작 지점 바꿔주기 위한 tmp를 0으로 초기화한다. 이제 보석 종류의 개수를 구하도록 한다. for문을 통해 gems를 순회하면서 m에 넣어주도록 한다. gems_size = m.size()로 하여 개수를 저장하고, m은 clear하여 비워주도록 한다. 다시 gems를 순회하면서 정답을 알아내면 된다. m을 초기화 하였으니 m[gems[i]] == 0이면 1을 넣어주고, 0이 아니라면 같은 보석이 이미 있는 경우이므로 해당 보석의 개수를 +1로 해준다. 그리고 q에 push. 모든 종류..
leftHand는 왼손의 현재 키패드 위치, rightHand는 오른손의 현재 키패드 위치, leftDist는 numbers[i]와 현재 왼손 위치의 거리, rightDist는 numbers[i]와 현재 오른손 위치의 거리를 나타낸다. 맨 처음 왼손과 오른손은 *, #에 위치하기 때문에 각각 10, 12를 넣어준다. 이제 for문으로 numbers를 순회한다. numbers[i]가 1, 4, 7이면 "L", numbers[i]가 3, 6, 9이면 "R", numbers[i]가 2, 5, 8, 0 이면 가까운 손으로 누르고, 거리가 같으면 주 손으로 누르면 된다. 만약 numbers[i] == 0인 경우, 11로 바꿔주어 왼손과 오른손과의 거리를 구한다. tmp_l은 leftHand - numbers[i]..
map과 multimap을 사용했다. 인덱스와 재생 횟수, 장르, 장르 별 재생 횟수를 다뤄야 하기 때문에 상당히 복잡하게 코딩을 했다. multimap mm을 선언하였다. mm의 key는 genre, value는 재생 횟수와 해당 곡의 인덱스를 pair로 묶어서 값을 넣는다. map m. 각 장르별 재생된 총 횟수이다. 우선 모든 장르와 재생횟수, 총 재생 횟수를 for문을 통해 모두 다 넣는다. 다음 for문에서는 각 장르별로 2개씩 재생 횟수의 내림차순으로 정렬하여 mm에 넣는 작업을 한다. 내림차순 정렬을 하기 위해 vector v를 선언한다. 해당 장르의 재생 횟수와 인덱스를 v에 넣고 sort한다. sort의 desc는 pair 형태에 맞게 따로 정의했다. 정렬이 끝나면 원래 있던 mm의 장르..
#include #include using namespace std; int solution(int m, int n, vector puddles) { int answer = 0; int check[101][101] = {0, }; int visited[101][101] = {0, }; for(int i = 0; i < puddles.size(); i++) check[puddles[i][1]][puddles[i][0]] = -1; visited[1][0] = 1; for(int i = 1; i
DFS, BFS 두 방법으로 풀 수 있는 문제다. 본인은 BFS로 풀었다..! 우선 큐를 만들어 준다. 단어를 탐색하고, 해당 단어의 인덱스까지 pair로 묶어주어 q에 넣어준다. tmp_q는 임시 큐로 단계를 올릴 때 사용한다. 그리고 answer는 1로 초기화 하였다. 1단계의 단어를 바로 찾기 때문에 1로 초기화 하였다. 우선 words에 target이 있는지 확인한다. 없으면 바로 0 리턴. target이 words 안에 있다면 탐색을 시작한다. 1단계의 단어를 탐색하기 위해 0 ~ words.size()만큼 반복한다. 그리고 count를 이용하여 begin과 words[i]를 비교하여 한 개의 알파벳을 바꿀 수 있는지 확인한다. count가 begin.size() - 1 이라면 한 개의 알파벳을..
#include #include #include using namespace std; int answer = 0, tomato = 0; queue q, tmp_q; int arr[1001][1001]; bool visited[1001][1001] = {false, }; void bfs(int M, int N, pair p) { int row = p.first; int col = p.second; q.pop(); //up if(row - 1 >= 0 && row - 1 = 0 && col < M && visited[row - 1][col] == false) { visited[row - 1][col] = true; arr[row - 1][col] = 1; tmp_q.push(make_p..
문제를 잘 읽다보면 타일의 한 변의 길이가 피보나치와 같이 증가하는 것을 알 수 있다. 그래서 피보나치를 이용하여 N개의 타일의 한 변의 길이를 구하였다. DP를 이용하여 arr[i] = arr[i - 1] + arr[i - 2] 의 값을 넣어주었다. 그리고 둘레의 길이를 구하는데 arr[N]의 길이와 arr[N - 1]의 길이가 필요하다는 것을 알 수 있다. arr[N] * 4와 arr[N - 1] * 2를 더하여서 answer에 넣어주고 리턴하면 끝..! 주의점은 리턴값이 long long이므로 배열도 long long으로 해줘야 한다. 만약 int형이라면 효율성 테스트에서 틀리게 된다...! #include #include using namespace std; long long solution(in..