목록알고리즘 (547)
N
DP를 이용하면 된다. 어떻게 풀면 될까 고민하다가 n을 1부터 차례대로 넣어봤을 때의 값을 계산해 보았다. 하다보니 피보나치와 같은 결과를 얻을 수 있어서 DP의 피보나치를 사용하였다..! #include #include using namespace std; int arr[600001] = {0, }; int solution(int n) { arr[1] = 1; arr[2] = 2; for(int i = 3; i
map을 이용하여 문제를 접근했다. 우선 알파벳 대문자를 모두 사전에 등록을 해야 한다. 그래서 string형 벡터 a에 대문자 알파벳을 모두 넣어준다. 그리고 count는 단어를 나누는 위치를 나타내고, current_num은 사전의 단어 개수를 나타낸다. 형 map을 선언했으니 알파벳 대문자와 인덱스를 넣어주도록 한다.(1 ~ 26까지) 이제 while문으로 단어를 압축하자. 현재 입력 w, 다음 글자 c, 추가할 단어 wc를 선언하여 값을 넣어준다. 그리고 반복자를 각각 선언하여 사전에서 찾도록 한다. 만약 w가 사전에 있다면 answer에 인덱스를 넣어주고, count 값을 늘려주거나 1로 초기화한다. wc의 반복자를 이용하여 count를 조절한다. 만약 wc가 사전에 없다면 count를 1로 바..
조건이 까다로운 문제였다... 우선 문자열에서 #이 붙은 음을 다른 문자로 치환을 하여야 한다. 이 부분이 첫번째 난관이다. 본인은 맵을 이용하여 다른 문자로 치환하였다. C#, D#, F#, G#, A#을 겹치지 않은 문자로 맵에 넣어주었다. 그리고 change() 함수를 따로 정의해서 musicinfos에 들어있는 멜로디와 m의 문자열을 #을 없앤 문자로 바꿔주었다. change함수는 별로 어렵지 않으니 쉽게 따라갈 수 있을 것이다..! 이제 musicinfos를 분해해야 한다..! 우선 시간을 나눠야 한다. bHour = 재생 시작된 시, bMin = 재생 시작된 분, aHour = 재생 끝난 시, bMin = 재생 끝난 분, time = 재생된 시간(분), bTime = 이전 곡의 재생된 시간(분..
주어진 문자열을 나누고, 맵을 이용하는 것이 핵심인 문제..! 우선 유저가 어떤 상태인지 확인하는 state 벡터를 선언하고, 해당 유저의 닉네임을 확인하기 위해 형 map인 user를 선언하였다. (state는 Enter, Leave, Change) record의 크기만큼 for문을 돈다. 우선 record[i]를 tokenize 하여 문자열을 나누도록 한다. 문자열을 나눈 결과를 str[3]에 각각 (state, id, nickname)을 저장하도록 하였다. str[0]을 확인하여 Enter인 경우 state에 "님이 들어왔습니다."를 넣어주고, 해당 id의 닉네임을 주도록 한다. Leave인 경우 "님이 나갔습니다."를 state에 넣어주도록 한다. 마지막으로 Change인 경우 해당 id의 nic..
LRU 형태의 캐시이므로 큐 형태로 접근을 하였다. 데이터 접근이 쉽도록 벡터를 사용하였지만, 방식은 큐와 같다. 우선 cacheSize가 0이면 캐시가 불가능하므로 데이터 수 * 5를 바로 리턴하였다. 0이 아니라면 for문을 통해 cities.size()만큼 반복한다. 대소문자 구분 없이 같은 단어이면 동일하게 처리해야하므로 transform을 사용하여 모두 소문자로 바꿔주었다. 그리고 위에서 선언했던 string형 벡터 cache를 이용한다. cache에 현재 데이터가 있는지 find() 함수를 통해 찾도록 한다. 만약 itr이 cache.end()라면 cache에는 cities[i]가 없다는 뜻이므로 cache miss가 발생한다. answer += 5를 해주기 전에 cache.size()를 검사..
먼저 str1과 str2를 두 글자씩 끊어서 각각 s1, s2 벡터에 넣어주도록 한다. 그러기 위해서는 str1과 str2을 모두 대문자나, 소문자로 바꿔주어야 한다. 그래서 transform() 함수를 이용하여 두 글자 모두 소문자로 바꿔주었다. 그리고 각각 for문을 이용하여 2글자씩 끊고, 두 글자 모두 알파벳인 경우 s1, s2에 넣어주었다. 만약 for문을 다 돈 후에 s1, s2가 모두 비어있으면 65536을 바로 리턴해준다. 아니라면 max변수에 s1.size() + s2.size()를 대입한다. (max = 합집합, min = 교집합을 나타낸다..! 변수명 오류..ㅎㅎ) s1, s2의 크기를 비교하여 교집합의 개수를 구하는 for문을 수행하고, max -= min을 해주면 합집합의 개수가 ..
간단하게 풀 수 있는 문제다..! 우선 while문으로 계속 반복한다. a = (a / 2) + (a % 2) b = (b / 2) + (b % 2) 를 넣어주도록 한다. 그러면 이겼을 때 다음 라운드에서 받을 수 있는 차례가 나오게 된다. 만약 a와 b가 같다면 현재 라운드에서 만나는 것이므로 answer을 리턴해주면 끝..! #include using namespace std; int solution(int n, int a, int b) { int answer = 0; while(1) { a = (a / 2) + (a % 2); b = (b / 2) + (b % 2); answer++; if(a == b) return answer; } }
우선 처음에 answer에는 [0, 0]을 넣어주도록 하자. 만약 모든 단어가 규칙에 맞게 끝말잇기를 했다면 [0, 0]을 바로 리턴하기 위함이다. 그리고 첫 단어는 check에 넣어주었다. 이제 1번째 인덱스의 단어부터 끝까지 단어를 탐색하도록 한다. turn과 count 는 선언 시 1로 초기화 하였기 때문에, 순서에 맞게 +1 씩 해주면 된다. for문 설명) 우선 turn++을 하여 차례를 세도록 한다. 그리고 words[i]의 첫 번째 글자와 words[i - 1]의 마지막 글자가 일치하는지 검사한다. 일치하지 않으면 바로 break를 하여 빠져나오고, 일치한다면 check 벡터에 단어가 있는지 검사한다. 만약 check 벡터에 단어가 없으면 check에 넣어주도록 한다. 단, 마지막 단어일 때..