본문 바로가기
반응형

C++245

[프로그래머스/C++] 자동완성 HTML 삽입 미리보기할 수 없는 소스 [문제 요약] ​ 자동완성 기능을 넣기 위해서 한번이라도 입력된 단어는 자동으로 출력되도록 기능을 구현하기로 했다. 이 때, 앞부분이 같은 단어라면 구분을 위해서 구분이 될 때 까지 단어를 입력해야한다. 만약 goat와 gone이 있다면 구분을 위해 goa와 gon을 입력해 주어야 한다. 그래서 입력해야 할 문자의 수는 6이다. ​ HTML 삽입 미리보기할 수 없는 소스 [풀이] 처음에 보고 trie 알고리즘을 활용하면 쉽게 풀 수 있을 것 같아서 trie 알고리즘을 활용해 풀었다. 그런데 풀고나서 다른 사람들의 풀이를 보니 정렬을 활용해 푼 사람들이 많았다. 게다가 테스트 케이스에서는 더 빨랐다... ㅠㅠ 정렬을 활용한 풀이는 앞이나 뒤에 오는 단어와 비교해서 몇.. 2024. 1. 7.
[프로그래머스/C++] 거스름돈 HTML 삽입 미리보기할 수 없는 소스 HTML 삽입 미리보기할 수 없는 소스 처음에 DP로 풀면 되겠다 생각했다가 단순히 100종류에 100000개면 정렬만 잘 하면 빨리 통과하지 않을까 생각해서 그냥 풀었다. 그랬더니 효율성에서 시간초과가 걸려 다시 DP로 돌아왔다. ​ 2차원 vector를 만들고 n원을 만드는 경우를 재귀로 구하도록 처음에 코드를 짰는데, 효율성 테스트 중 하나를 자꾸 통과하지 못했다. 그래서 1차원 vector로 바꿔서 다시 풀었더니 통과할 수 있었다. ​ 1차원 vector로 푸는 방법은 처음에 동전 하나를 사용해서 만들 수 있는 n보다 작은 모든 거스름 돈의 수를 구한다. 그리고 그 거스름 돈의 자리에 1을 저장한다. 이후 두번째 동전도 사용해 거스름 돈을 주는 수를 구한다... 2024. 1. 7.
[프로그래머스/C++] 셔틀버스 HTML 삽입 미리보기할 수 없는 소스 HTML 삽입 미리보기할 수 없는 소스 특별한 알고리즘 없이 그리디하게 풀 수 있는 문제였다. 먼저 특정 시간에 버스가 오면 그 때, 탈 수 있는지 없는지를 판단한다. ​ 만약 탈 수 있다면 버스가 도착하는 시간에 나와서 타면 된다. ​ 문제는 버스 탑승 인원만큼 서 있을 때가 문제다. 만약 버스 탑승 인원 만큼 서 있다면, 마지막에 버스에 탑승하는 사람보다 1분 빠르게 줄을 서면 된다. (마지막에 줄을 서 있는 인원이 아니라 마지막에 버스에 탑승하는 인원이다.) ​ 요약하면 탑승시간 변수에 버스가 오는 시간을 저장한다. 만약 그 시간에 탑승하는 인원들이 많아 버스의 탑승인원과 같거나 많아지면 마지막에 탑승하는 인원의 탑승시간보다 1분 빨리나오도록 한다. 버스의 운.. 2024. 1. 7.
[프로그래머스/C++] 최적의 행렬 곱셈 HTML 삽입 미리보기할 수 없는 소스 HTML 삽입 미리보기할 수 없는 소스 처음에 행렬이 곱할 수 있는 순서대로 주어지는건지 고민했지만, 순서대로 계산이 가능하도록 주어질 것이라고 보고 문제를 풀었다. 문제를 보면 최악의 경우 200개의 행렬의 모든 순서를 전부 계산해보고 풀기에는 무리가 있어서 DP로 풀기로 했다. ​ A번째에서 C번째 행렬까지의 곱셈연산을 구한다고 하면 (A행렬과 C행렬 사이에 B행렬이 있다고 가정) [A 행렬 ~ B 행렬의 최소 곱셈연산 횟수] + [B 행렬 ~ C 행렬의 최소 곱셈 연산횟수] + [이번 연산 횟수] 값이 최소가 되는 행렬을 찾으면 A 행렬 ~ C 행렬의 최소 곱셈 연산 횟수가 된다. 즉, 이전에 계산한 최소 곱셈연산 횟수가 다음 계산에도 사용되므로 DP로 풀 수.. 2024. 1. 7.
[프로그래머스/C++] 퍼즐 조각 채우기 HTML 삽입 미리보기할 수 없는 소스 HTML 삽입 미리보기할 수 없는 소스 [풀이] 처음에 문제를 보고 빈 공간에 조각을 채워넣어야 하는 줄 알고 어렵다고 생각했는데, 조건에 조각을 넣었을 때, 빈 공간이 생기면 안된다는 조건을 보고 생각보다 쉽겠다고 생각했다. 하지만 막상 해보니 코드가 엄청 길어지고 처음 생각했던 방법과 다르게 풀어서 의외로 오래 걸렸다... 내가 시도한 방법은 조각이 들어갈 수 있는 공간을 탐색하고, 그 공간의 모양을 파악해 90도로 회전해 나올 수 있는 모양들은 전부 같은 모양으로 정했다. 그리고 조각의 모양이 90도로 회전해 나올 수 있는 모양 중 하나라면 채워넣는 식으로 코드를 짰다. 이후 같은 조각인지 비교하는 방법은 다음 그림과 같이 만들었다. 만약 위와 같은 퍼즐의 공.. 2024. 1. 7.
[프로그래머스/C++] 다단계 칫솔 판매 HTML 삽입 미리보기할 수 없는 소스 HTML 삽입 미리보기할 수 없는 소스 [풀이] 판매한 금액의 10%가 자신을 초대한 사람에게 전달 되므로 초대한 사람이 누구인지 잘 매칭만 되면 해결되는 쉬운 문제다. 등록된 사람이 누구의 추천을 받아서 들어왔는지를 빠르게 찾기 위해 map으로 저장해 시간을 줄이고, 판매한 금액을 정산 할 때마다, 추천을 해준 사람에게 10%씩 금액을 전달하면 된다. [아이디어 요약] 등록되어 있는 사람을 누가 추천했는지 map으로 만든다. 판매한 사람의 금액을 정산하고 10%는 map에 있는 추천인에게 금액을 전달한다. 추천인은 금액을 전달 받으면 다시 자신을 추천한 사람에게 10%의 금액을 정산한다. 10%의 금액이 0이거나, 추천한 사람이 없으면 반복문을 종료하고 다음 금액.. 2024. 1. 7.
[프로그래머스/C++] 불량 사용자 HTML 삽입 미리보기할 수 없는 소스 HTML 삽입 미리보기할 수 없는 소스 이 문제는 중복된 경우의 수를 제거하는게 핵심인 문제다. 먼저 banned_id 와 user_id를 비교해서 ban을 할 수 있는 사용자 목록을 뽑고, ban할 수 있는 경우의 수를 완전 탐색해 풀었다. 이 때, 한번 ban할 수 있는 목록으로 뽑힌 사용자가 다시 뽑힐 수 는 없으므로 이 경우를 제거했고, ban할 수 있는 사용자가 전부 뽑히면 Set에 넣어 중복을 제거 했다. ​ ​ [아이디어 정리] user중 ban할 수 있는 사용자의 목록을 뽑는다.​ ban 할 수 있는 사용자들이 중복되지 않게 뽑고, Set에 넣어 중복을 제거한다.​ 최종적으로 구한 Set의 size를 return 한다. HTML 삽입 미리보기할 수 없.. 2024. 1. 6.
[프로그래머스/C++] 최고의 집합 HTML 삽입 미리보기할 수 없는 소스 HTML 삽입 미리보기할 수 없는 소스 처음에 보고 쉽다고 생각했지만, 푸는 방법에 대한 이유를 찾다보니 라그랑주 승수법을 알고 있어야 하는 문제였다. 라그랑주 승수법이란 조건부 함수의 최대화 또는 최소화 문제에 대한 해석수법의 일종인데, 이것을 지금 다루기는 어려우니 생략하려고 한다. ​ 쉽게 말하면 두 식(제약조건, 목적함수)의 gradiant 방향이 같은 곳이 정답이 되는 부분인데, 쉽게 말하면 접하는 부분을 의미한다. 이 때, 방향은 같지만 크기가 다를 수 있기 때문에 라그랑주 승수를 이용해 크기를 같게 해준다. ​ [라그랑주 승수법 참고] https://blog.naver.com/waterforall/222730998200 [최적화(optimization).. 2024. 1. 6.
[프로그래머스/C++] 4단 고음 HTML 삽입 미리보기할 수 없는 소스 HTML 삽입 미리보기할 수 없는 소스 [풀이] 처음에 1부터 시작해 최종 음높이 n이 되는지 탐색하도록 코드를 짰는데, 경우의 수가 너무 많아 시간 초과가 걸렸다. 그래서 역으로 n부터 시작해 역으로 1까지 돌아오도록 코드를 짰다. 이 경우 코드의 패턴은 n을 3으로 나눌 수 있는 경우와 없는 경우로 나뉘는데 ​ n을 3으로 나눌 수 있는 경우 n/3 의 경우를 재귀로 탐색하면서 *의 개수를 1 늘려준다. n에서 1을 뺀 다음 +의 개수를 1 늘려준다. ​ 위와 같이 탐색해 나가면 된다. ​ [주의] +의 개수가 늘어난 만큼 *의 개수가 늘어나는데 [사용한 +의 개수/2 - 사용한 *의 개수] 가 앞으로 추가되어야 할 *의 개수다. 그러므로 추가해야할 *의 개수 .. 2024. 1. 6.
[프로그래머스/C++] 양과 늑대 HTML 삽입 미리보기할 수 없는 소스 HTML 삽입 미리보기할 수 없는 소스 [풀이] 처음에 모든 경우를 구하면 시간이 많이 오래 걸릴 것 같아서 어떻게 해야할까 생각했는데 제한사항에 info의 길이가 17밖에 되지 않는 것을 보고 충분히 완전탐색해도 되겠다는 생각이 들었다. ​ 첫 노드부터 시작해 갈 수 있는 노드를 구해서 그 노드를 방문하도록 재귀적으로 코드를 짰다. 만약 특정 노드를 방문했는데, 양의 수와 늑대의 수가 같아지면 그 때는 더 이상 재귀를 하지 않도록 했다. ​ [아이디어 정리] 방문할 수 있는 노드들을 vector로 정리해둔다.​ 새 노드를 방문 할 때마다 다음에 갈 수 있는 노드들을 새로 갱신한다. 만약 새 노드를 방문했을 때, 늑대의 수가 양의 수와 같아지면 그 루트에서는 양이 .. 2024. 1. 6.
[프로그래머스/C++] 가장 먼 노드 HTML 삽입 미리보기할 수 없는 소스 HTML 삽입 미리보기할 수 없는 소스 [풀이] 노드간에 길이 연결 되어 있는지 vector로 표현하고, BFS로 탐색해 나가면 되는 문제다. BFS로 탐색을 하므로 처음 방문했을 때가 최단 거리인 사실을 생각하면, 단순히 BFS로 탐색하면서 이전 노드를 방문할 때 걸린 거리 + 1 을 노드에 저장하면 되는 문제다. ​ [아이디어 정리] Vector를 이용해 노드간에 연결이 되어있는지 표현한다.​ 1번 노드부터 BFS로 방문하며 새로 방문한 노드에는 이전 노드를 방문하는데 걸린 거리 +1을 저장한다. 모든 노드를 탐색한 후에는 가장 먼 노드의 거리가 얼마인지 구한 다음 가장 먼 노드의 개수를 return한다. HTML 삽입 미리보기할 수 없는 소스 #include .. 2024. 1. 6.
[프로그래머스/C++] 이중우선순위큐 HTML 삽입 미리보기할 수 없는 소스 HTML 삽입 미리보기할 수 없는 소스 테스트 케이스의 예시가 적어서 그런지 vector에 숫자를 삽입 할 때, 이분 탐색으로 들어갈 위치만 잘 정해주니 쉽게 풀리는 문제였다. ​ [아이디어 정리] 1. vector 에 숫자를 삽입 할 때, 이분 탐색으로 삽입 될 위치를 계산한다. ​ 2. 삭제 명령이 뜰 경우 최대 최소에 따라 vector의 맨 앞 숫자를 삭제하거나 맨 뒤의 숫자를 삭제한다. HTML 삽입 미리보기할 수 없는 소스 #include #include using namespace std; vector answer; void InsertNum(string num) { int st, ed,mid; int reNum=stoi(num); st = 0; ed =.. 2024. 1. 6.
[프로그래머스/C++] 길 찾기 게임 HTML 삽입 미리보기할 수 없는 소스 HTML 삽입 미리보기할 수 없는 소스 [풀이] 문제를 보면 전위 순회와 후위 순회를 나타내는 것은 어렵지 않다. 하지만, 노드의 정보를 바탕으로 그래프를 그리는게 약간 힘들다. ​ 조건을 보면 모든 노드는 다른 x값을 갖는다. 이를 이용해 x값의 좌표에 몇번 째 노드인지 값을 저장하는 array를 하나 만들어 결과 값을 출력 할 때 사용한다. ​ 또한 트리는 이진트리의 형태이며, 같은 레벨에 있는 좌표는 전부 같은 y 값을 갖는다. 그러므로 y값을 기준으로 노드들을 정리한 다음 레벨을 점차 낮추며 그래프를 그리면 쉽게 이진트리를 그릴 수 있다는 사실을 알 수 있다. ​ [아이디어 정리] 1. 이진트리의 자식 관계를 그리기 위해 y축을 기준으로 Map을 만들어 노드.. 2024. 1. 6.
[프로그래머스/C++] 뒤에 있는 큰 수 찾기 HTML 삽입 미리보기할 수 없는 소스 HTML 삽입 미리보기할 수 없는 소스 숫자를 스택에 쌓으면서 비교하면 되는 문제다. 내 숫자보다 큰 숫자가 뒤에 오는지를 구하면 되기 때문에 스택의 맨 위에 있는 수보다 작은 숫자가 오면 스택의 위에 쌓고 큰 수가 오면 스택의 맨 위에 있는 숫자가 뒷 큰 수를 찾았기 때문에 뒷 큰수를 기록하고 스택에서 제거한다. 그리고 새로 맨 위에 오는 숫자가 현재 숫자 보다 큰 지 비교하는 과정을 반복한다. ​ [아이디어 정리] 1. 스택의 맨 위에 숫자가 현재 숫자보다 큰 지 비교하고, 작으면 스택의 맨 위에 쌓는다. 2. 만약 클 경우 스택의 맨 위의 숫자를 제거하고 뒷 큰수를 기록한 다음 다시 스택의 맨 위 숫자와 비교한다. 3. 위 과정을 반복한다. HTML 삽입 미리.. 2024. 1. 6.
[프로그래머스/C++] 연속된 부분 수열의 합 HTML 삽입 미리보기할 수 없는 소스 HTML 삽입 미리보기할 수 없는 소스 [풀이] 처음에는 길이가 1000인 줄 알고 for 문을 두번 돌려서 빠르게 풀려고 했다. 근데 알고보니 길이가 1,000,000이여서 투포인터를 이용해 문제를 풀었다. 먼저 주어진 수열 대신 0번 idx에는 0, 1번 idx에는 기존 수열의 0~0 idx까지의 합 2번 idx에는 기존 수열의 0~1 idx까지의 합을 저장하는 새로운 수열 newSeq를 만들었다. ​ 이후 ed를 1, st를 0으로 시작해 newSeq[ed]-newSeq[st]의 값이 k보다 작으면 ed의 값을 1 늘리고, newSeq[ed]-newSeq[st]의 값이 k보다 크면 st의 값을 1늘렸다. 만약 newSeq[ed]-newSeq[st]의 값이 k와.. 2024. 1. 6.
반응형