본문 바로가기

전체 글

(105)
[프로그래머스]H-index val번 이상 인용횟수 중 가장 큰 val을 찾으면 된다. 주어진 배열인 citations를 정렬하고, val을 0부터 citations배열의 마지막까지 +1씩 늘려가면서 lower_bound를 이용해 val번 이상의 가장 최저점을 찾아 인용횟수를 구하고 조건에 부합하는지 검사한다. 조건에 맞다면 answer변수에 val을 넣어준다. #include #include #include using namespace std; int solution(vector citations) { int answer = 0; int val = 0; sort(citations.begin(), citations.end()); while(val = val ? val : answer; val++; } return answer; } ..
[프로그래머스]더 맵게 힙을 이용해서 문제를 해결할 수있다. 처음엔 힙을 사용하지 않는 방법으로 문제를 해결하려 했는데 효율성의 문제로 틀렸다. #include #include #include #include using namespace std; int tree[1000001] = { 0 }; int pop(int *max) { int val = tree[1]; int cur = 1, child = 2; tree[1] = tree[*max]; *max = *max - 1; while (child
[프로그래머스]소수 찾기 #include #include #include using namespace std; bool check[8];vector store;string str; //부분수열의 합void DFS(string val) { store.push_back(val); for(int idx = 0; idx
[프로그래머스]큰 수 만들기 높은 자리수를 기준으로 차례로 검사해 큰 수를 알아낼 수 있다. 그래서 최대 k(제거해야 할 개수)만큼 제거하기위해 이중 반복문을 사용한다. 안쪽 반복문에서는 가장 큰 수를 골라내고 위치를 pos변수에 저장한다. 안쪽 반복문이 종료된 후 제거해야할 수인 k값이 남았다면 k와 현재 인덱스인 i를 갱신한다. #include #include using namespace std; string solution(string number, int k) { string answer = ""; int size = number.length() - k; int max = 0, pos = 0; for (int i = 0; size != answer.length(); i++) { for(int j = i; j 0) { k -=..
[프로그래머스]가장 큰 수 정렬한 후에 합치는 식으로 코드를 작성했다. 문제의 요구사항에 맞춰 정렬하기 위해 두 개의 값을 문자열로 바꾸고 A + B, B + A 이런식으로 순방향과 역방향으로 문자열을 합친다. 만들어진 문자열을 숫자형으로 바꾼 후 대소관계를 판별해서 반환해준다. (compare함수에서 문자열을 이용하지 않고 정렬을 시도했지만 1~6, 12번 케이스에서 틀린답을 구해서 실패했다) #include #include #include using namespace std; bool compare(int a, int b) { string A = to_string(a); string B = to_string(b); int left = stoi(A + B); int right = stoi(B + A); return left > ..
[프로그래머스]조이스틱 우선 A로 이루어진 name의 길이만큼의 문자열(str)을 만든다. 정답을 도출하기위해 그리디 기법을 사용했는데, 두 개의 반복문으로 우측과 좌측으로 각각 순회한다. 이 때 str과 name의 문자가 같을 때 이동횟수를 추가해준다. (str[0] == 'A' && name == 'A') 문자가 다르다면 반복문을 탈출해주고 pos변수에 탈출할 때까지의 이동횟수를 넣어주는데 왼쪽과 오른쪽중 적게 이동한 곳의 위치를 넣는다. (만약 str과 name이 모두 같은 문자라면 현재까지의 count값을 반환한다) 위치를 갱신하고 거기까지 이동한 횟수를 count에 더하고, 현 위치의 str과 name의 문자값의 가장 적은 차이(역순으로의 개수를 셀 때 크기가 더 작을 수 있다)만큼 count에 더해준다. #inclu..
[프로그래머스]컬러링북 주의!! // 전역 변수를 정의할 경우 함수 내에 초기화 코드를 꼭 작성해주세요. 코드에서 전역변수 사용하고 함수내에서 따로 초기화하지 않는다면 틀리게 된다. DFS를 사용했는데 check 배열에 다른 값을 부여해서 구간을 분리할 수 있도록 했다. DFS를 도는 동안 count를 증가시켜 한 구간의 순회가 끝난 후 max변수와 비교해 삽입할 수 있도록 했다. #include using namespace std; typedef struct { int y, x;} dif; dif dir[4] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; long long check[101][101] = { 0 };int count = 0;vector map; void DFS(int row, int ..
[프로그래머스]문자열 압축 1에서부터 s.size() / 2까지의 길이를 기준으로 가장 짧게 될 수 있는 압축 사이즈를 구했다. 정확히 단위마다 끊어져야 하므로 첫 for문에서 +sec(단위)씩 증가하도록 했다. 여기서 같은 쌍을 가질 수 있는 한계인 i < s.size() - (2 * sec) + 1을 기준으로 정해진 한계를 넘어가면 남아있는 문자열 길이를 전부 카운트에 넣고 반복문을 종료하고 한계를 넘어서지 않았다면 sec(단위) 만큼 카운트에 넣어준다. 이후 while문을 순회하는데 같은 단어가 반복되면 뛰어넘도록 함수를 구성해준다. while문을 진행하면서 같은 쌍의 개수를 세기 위해 check++을 한다. 1 ~ 9 일수도 10 ~ 99 일수도 100 ~ 500 일수도 있기 때문에 check로 구한 수를 while문이 끝..