목록kakao (40)
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]..
완전 탐색으로 풀어야 한다. 문자열 형태의 숫자를 int형으로 바꿔서 저장하기 위한 vector num. 문자열 형태의 숫자를 저장하는 string n. 연산자의 위치를 나타내는 vector location. 연산자의 종류를 나타내는 vector exp. for문을 통해 expression을 순회한다. 만약 expression[i]가 연산자라면 num 벡터에 n을 int형으로 바꿔서 넣어준 후, n = ""으로 초기화 해준다. 그리고 exp 벡터에서 해당 연산자가 있는지 검사를 하여 중복이 없으면 exp에 넣어준다. location에는 해당 연산자의 위치를 넣어줘야 하기 때문에 i를 넣어주도록 한다. 만약 expression[i]가 연산자가 아니라면 숫자를 나타내므로 n += expression[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()를 검사..