본문 바로가기

알고리즘 문제 풀이

(14)
[하한문] 프로그래머스 - 뉴스 클러스터링 이것도 문제가 매우 길다. 간략하게 설명해 보자. string 2개가 입력으로 들어오고 그 string split 한 다음에 교집합 합집합을 구해서 원하는 값을 얻는 것이다. 코드 설명을 하자면 우선 대소문자는 구분 안한다고 했으므로 소문자로 바꿔서 비교했다. 그다음 string을 split 하는 함수를 만들어서 vector에 담았다. 알파벳만 처리하기로 했으므로 isalpha 함수를 사용햇다. 마지막 main함수에서 중복을 허용한다고 했다. 이점이 조금 처리하기 까다로워서 그냥 두 vector에서 다 삭제하는 방식으로 구현했다. #include #include #include #include using namespace std; string lower(string s){ string str=s; int..
[하한문] 프로그래머스 - 오픈채팅방 문제가 너무 길다. 간략하게 설명하자면 유저의 id와 name을 받아서 enter로 들어왔을 때 "name님이 들어왔습니다" 가 leave로 들어왔을 때 "name님이 나갔습니다"를 뽑아내면 된다. 쉬워 보이지만 변수가 있긴 하다. enter로 똑같은 id가 들어왔을 때 마지막 enter에 입력된 name으로 변경되어야한다. 그전 꺼 까지 change도 name을 바꾸는 역할을 한다. python은 split 함수가 구현이 되어있는데 c++은 존재하지 않는다. strtok도 예전 과제할 때 써봤는데 나쁘지 않았지만 별로 좋다고 느끼지 않았다. 그래서 stringstream을 사용해서 따로 split 함수를 구현했다. vector spl(string str){ vector answer; stringstre..
[하한문] 프로그래머스 - 예상대진표 문제가 어렵게 설명되있다. 문제의 설명이 복잡하다는 것이 아니라 쉬운 문제지만 쉽게 설명하기 어려운 문제였던것 같다. 그냥 a랑 b랑 언제 만나겠는가를 묻는데 번호를 부여 받는 번은 자신의 번호를 2로 나누면 된다. 나머지가 있는 경우는 +1를 해주면 된다. #include using namespace std; int solution(int n, int a, int b) { int count =0; while(a != b){ count ++; if(a %2 ==0) a/=2; else{ a/=2; a++; } if(b%2 ==0) b/=2; else{ b/=2; b++; } } return count; } 답은 상상 이상으로 쉽게 나온다. 출처-프로그래머스
[하한문]프로그래머스 - 행렬의 곱셈 행렬의 곱셈을 프로그래밍하라.. 읽기만 해서는 그렇게 어려운 문제는 아니였다. 내가 생각하기엔 4개의 for문이 있으면 될꺼라고 생각했지만 행렬의 곱셈이 이루어 질려면 왼쪽 행렬의 열과 오른쪽 행렬의 행이 같아야 하므로 3개가 필요했다. 3X2 * 2X4 = 3X4 같은 개념으로 행렬의 곱셈이 이루어 지니깐. 따라서 arr1의 row로 시작해 arr2의 열을 다 곱해주는 방식으로 해서 새롭게 생기는 행렬은 각 행부터 채워주는 방식으로 작성해 보았다. #include #include using namespace std; vector solution(vector arr1, vector arr2) { vector answer; int arr1_row = arr1.size(); int arr1_col = arr..
[하한문] 프로그래머스 - 수식최대화 문제는 너무 길어서 생략하겠다. 간략하게 설명하자면 * + - 이렇게 3개의 연산자에 우선순위를 주어서 가장 큰 값을 만들어 내라는 문제다. 처음에는 이 문제를 vector만 이용해서 풀려고 했다. 우선순위는 3개라서 경우가 6개 밖에 없어서 그냥 대입해도 됬지만 근사하게 dfs로 해서 우선순위를 주었고 그다음 vector에 string으로 숫자와 연산자를 구별해서 넣은 다음 우선 순위 놓은 순 부터 for문을 다 돌렸다. 연산자를 i 번째 인덱스 에서 발견했다고 했을때 i-1번째와 i+1번째의 숫자와 i번째 연산자를 삭제하고 그 자리에 다시 계산 한 값을 넣어주는 방식으로 구현해보았다. iterator를 사용 할 수 밖에 없었고 구글링해서 벡터 요소 삭제 요령을 많이 참고 했으나 70점 밖에 답이 나오..
[하한문] 프로그래머스 - 삼각달팽이 위와 같은 탑 모양의 순열을 만드는 것이다. 규칙을 찾아서 수식화 하기에는 너무 어려워 보여서 2차원 배열을 통해서 똑같이 생성하는 함수를 만들기로 했다. 저렇게 생겼지만 실제로는 1 2 9 3 10 8 4 5 6 7 이렇게 생겼다고 생각하면 만들기에 더 간편했다. #include #include #include using namespace std; int arr[1000][1000]; vector solution(int N) { vector answer; int num=1; int lv =1; int x=0,y=0; while(true){ int temp = num; if(lv == 1){ while(x
[하한문] 프로그래머스 - 땅따먹기 문제 설명 땅따먹기 게임을 하려고 합니다. 땅따먹기 게임의 땅(land)은 총 N행 4열로 이루어져 있고, 모든 칸에는 점수가 쓰여 있습니다. 1행부터 땅을 밟으며 한 행씩 내려올 때, 각 행의 4칸 중 한 칸만 밟으면서 내려와야 합니다. 단, 땅따먹기 게임에는 한 행씩 내려올 때, 같은 열을 연속해서 밟을 수 없는 특수 규칙이 있습니다. 예를 들면, | 1 | 2 | 3 | 5 | | 5 | 6 | 7 | 8 | | 4 | 3 | 2 | 1 | 로 땅이 주어졌다면, 1행에서 네번째 칸 (5)를 밟았으면, 2행의 네번째 칸 (8)은 밟을 수 없습니다. 마지막 행까지 모두 내려왔을 때, 얻을 수 있는 점수의 최대값을 return하는 solution 함수를 완성해 주세요. 위 예의 경우, 1행의 네번째 칸 ..
[하한문] 프로그래머스 - 점프와 순간 이동 점프와 순간 이동 OO 연구소는 한 번에 K 칸을 앞으로 점프하거나, (현재까지 온 거리) x 2 에 해당하는 위치로 순간이동을 할 수 있는 특수한 기능을 가진 아이언 슈트를 개발하여 판매하고 있습니다. 이 아이언 슈트는 건전지로 작동되는데, 순간이동을 하면 건전지 사용량이 줄지 않지만, 앞으로 K 칸을 점프하면 K 만큼의 건전지 사용량이 듭니다. 그러므로 아이언 슈트를 착용하고 이동할 때는 순간 이동을 하는 것이 더 효율적입니다. 아이언 슈트 구매자는 아이언 슈트를 착용하고 거리가 N 만큼 떨어져 있는 장소로 가려고 합니다. 단, 건전지 사용량을 줄이기 위해 점프로 이동하는 것은 최소로 하려고 합니다. 아이언 슈트 구매자가 이동하려는 거리 N이 주어졌을 때, 사용해야 하는 건전지 사용량의 최솟값을 re..