학습(0)/C++ 문제풀이 63

다단계 칫솔 판매

1. 각 부모와 자식을 map으로 묶었다.map에 저장하는 순서는 중요하지 않기에 unordered_map을 사용해 효율을 높였다.각 자식에 해당하는 부모와, 자신의 총수익을 pair로 묶어 벡터에 저장했다. (1쌍만 저장하면 되는데 vector말고 다른게 있는지 잘모르겠다)또, 문제에서 root인 center는 고려하지 않는다 했지만, 계산의 편의상 center의 존재를 두었다. 2. 사람은 최대 10,000명이지만, 판매자는 동일이름이 있을 수 있고 최대 100,000개까지 가능하기에 중복을 줄이고자 한번 더 map을 돌려 칫솔 판매금을 저장했다. 3. 각 총 수입의 10%를 자신의 부모에게 상납해야 한다.enroll은 입사 순이기에 역순으로 돌면 말단부터 접근 가능하다. *자신의 부모가 없을 때까지..

압축

1. A~Z 사전 등록효율적인 탐색을 위해서 사전에는 unordered_map을 사용하였다.알파벳 등록할 때, 타이핑 실수 막으려고 아스키 이용.char ->string 은 string 생성자를 이용하였고, 캐스팅을 통해 숫->문 변환. *+ '0'를 이용해 숫 -> 문을 시도하였으나, '0'(48)이 더해져 A가 아닌, q가 나오는 문제 발생. 2. 사전에서 입력값을 찾는 탐색첫자를 체크하고 참이라면 그 다음... 식으로 문자열의 길이를 늘인다던가, 아니면첫 문자를 찾아, 그 중 가장 긴 문자열을 찾는다던가.. 생각을 해보았지만, 복잡해질 것 같고 입력 길이도 최대 1000이었기에.처음부터 남은 문자열을 찾고, 찾지 못한다면 문자열의 길이를 줄이는 식으로 구현하였다. *msg.sustr(i, j) 를 ..

겹치는 선분 길이

선이 세개가 겹치는 경우를 어찌해야 할지, 머리 아프다.쉬고 온다.#include #include using namespace std;//2개 이상의 선분이 겹치는 부분의 길이, 중복 제외.int solution(vector> lines) { int answer = 0; //3개가 겹칠 수 있는 경우, 1시작 + 2끝을 기본 범위로 지정. if (lines[0][1] >= lines[1][0] && lines[1][1] >= lines[2][0]) { if(lines[0][0] = lines[2][1])//1,2 범위 내에 3시작과 끝이 있는 경우 {} else if (lines[0][0] = lines[2][0]) //3시작이 범위 내에 들어온..

연속된 수의 합, 등차 수열 응용

연속된 n개의 수의 합이 total이 되는 vector를 구하는 문제이다. 물론 나는 수열 공식 같은 거 몰라서 걍 풀었다. #include #include #include using namespace std;vector solution(int num, int total) { vector answer(num); vector numList(1050); iota(numList.begin(), numList.end(), -50); int i = (num >= total) ? 0 : 50; for (; i  등차수열의 합 공식을 이용한 풀이1. 평균값: total / num은 num개의 연속된 정수의 평균값. (중앙값)2. 시작 인덱스: 홀수: (num - 1) / 2, 짝수: num..

다음에 올 숫자, 등차/ 등비 수열

등차는 차수를 구하면 되고, 등비는 공비(나누기)를 구하면 다음 수를 구할 수 있다.common.size()-1 로 끝을 구했는데, back()을 사용하면 되는 일이었다, 익숙해지자.#include #include using namespace std;int solution(vector common) { int answer = 0; if ((common[1] - common[0]) == (common[2] - common[1])) //등차 { int d = common[1] - common[0]; return common.back() + d; } else //등비 { int r = common[1] / common[0]; r..

뮨자열 밀기

오른쪽이든 왼쪽이든 밀어서 더 조금 이동하는 이동 칸수 반환 문제. int solution(string A, string B) { int answer = -1;// min(l, r) int lMove = 100, rMove = 100; int size = A.size(); if (A == B) return 0; for (int i = 1; i  한 문제를 통과 못한다. 디버깅 왼쪽(실수로 좌우 반전) 이동 성공 후에도 오른 쪽이 통과 될때까지 break 되지않고 추가가 되는건 아닐까 싶어 테스트 해본다.왼쪽으로 한 칸 이동하면 맞출 수 있는 solution("hello", "elloh"); 를 넣어보았다.-> 오른 쪽이 새로 덮어지기 전에 반복문이 종료되어 min값..

유한소수 판별

이전에 푼 유클리드 호제법, 약수 구하기 찾아보고 품. 무친 에 gdc있었음 ㅋㅋ.#include #include using namespace std;int getGCD(int a, int b){ if (a % b == 0) return b; return getGCD(b, a % b);}int solution(int a, int b) { int answer = 1; int gcd = getGCD(a, b); b /= gcd; //기약분수로 만든 분모. //짝수는 2의 배수이므로 제외. for (int i = 3; i  다른 분.마지막 리턴이 이해가지 않는다.아, 2|5로 나누어 떨어졌다면 b는 1이 된다.그래서 분자가 뭐든 1로 나누어 떨어지지. 만약 2..

옹알이1

나는 모든 옹알이의 순열을 생성했다.그리고 순열에 중복 방지 처리를 하지 않아, 비효율적이다.일단 통과는 했으나, 입력값의 크기가 컸다면 통과하지 못했을 것이다.ex) aya aya aya aya aya aya 같은 게 6개.#include #include #include #include #include using namespace std;//4P1 ~ 4P4 순열int solution(vector babbling) { vector ayaya = { "aya", "ye", "woo", "ma" }; unordered_set ayaSet; int answer = 0; sort(ayaya.begin(), ayaya.end()); for (int r = 1; r  순열의 중복 제거는..

등수 매기

pair, map을 활용하는 문제는 어렵지 않은데, 자주 막히는 부분은 수학적 사고와 관련된 부분 같다.많이 풀어보고 사고해야 실력이 발전한다.사고를 하는 과정을 거치지 않으면 얻을 수 있는 걸 얻지 못하고 문제를 버리는거야. #include #include #include using namespace std;vector solution(vector> score) { vector answer(score.size()); vector> avg; //average, idx avg.reserve(10); for (int i = 0; i b.first; }); int rank = 0; int count = 0; //공동 등수 for (int i = 0; i

치킨 쿠폰

쿠폰 10개로 치킨을 한마리 교환할 수 있고, 교환한 치킨에는 또 쿠폰이 있다.총 몇마리의 치킨을 서비스 받을 수 있는가? 단순하게 생각했는데 뭐가 문제인지 모르겠다. #include #include using namespace std;int solution(int chicken) { int answer = chicken / 10; int coupon = chicken / 10; int remainder = coupon % 10; while (10  반례가 1999 ->222라고 한다.반례를 어떻게 생각하냐는 질문의 답사고력이 부족해도 될 때까지 노력하면 된다.  아니 근데 나는 222 잘 나오는데 뭐가 문제냐. 아.. 19 넣어보고 알았다.remainder 초기값이 ch..