알고리즘 33

[프로그래머스] 코딩테스트 연습 힙(Heap) 더 맵게 with C++

안녕하세요. 오늘은 프로그래머스 더 맵게 문제를 풀어보겠습니다. 더 맵게는 데이터중에서 가장 작은 숫자를 가져오는 시간이 중요한 문제입니다. 데이터 자체가 완벽하게 정렬이 되어있지 않더라도 항상 가장 작은 숫자를 가져오기 편한 자료구조를 생각해보면 힙(HEAP)이 있습니다. priority_queue자료구조를 사용해도 되지만 저는 예전에 만들어 놓은 힙 자료구조가 있길래 가져와 봤습니다! C로 구현된 자료구조라 OOP가 아니라 코딩하는데 익숙하지 않더라구요 허헣.... 다음에 자료구조 모두 C++로 만들어 놔야겠네요 ㅠ 더 맵게 문제는 힙을 이용해 가장 작은 두 수를 가져와서 합쳐서 다시 힙에 넣는걸 반복하면서 모든 값이 K이상임을 확인해주면 됩니다. 제가 구현한 힙은 가장 작은값이 1번 인덱스에 오기때..

[프로그래머스] 코딩테스트 연습 2017 카카오코드 본선 단체사진 찍기 with C++(brute force)

안녕하세요! 오늘은 프로그래머스 단체사진 찍기 문제를 풀어보겠습니다. 이 문제는 제 기준에선 참 문제를 이해하기 어렵게 만들었다고 생각했는데요. 왜냐면 일렬로 선다고 해놓고 나란히 선다고 하고 저는 전체 경우의 수가 시그마n=1to8 8P(8-n)*n^(8-n)개인줄 알았습니다... 그래서 레벨2에도 엄청난 수열문제가 나올 수 있구나... 이런 마음이였는데요 다행히 그건아니고 최대 8!개를 탐색하는 문제였습니다! 또, 맞왜틀(맞는데 왜 틀리지?!) 문제입니다! 한 session에 하나의 testcase가 아니라 여러 testcase가 들어있어 전역 변수를 초기화 해주지 않으면 오답이 됩니다! 모두 구현한 뒤 오답이길레 한참 헤맸습니다 ㅠㅠ 잡설은 이쯤하고! 같이 문제 풀어보시죠! 알고리즘은 brute f..

[프로그래머스] 문자열 내 p와 y의 개수, 문자열 내림차순으로 배치하기, 문자열 다루기 기본 with Swift

안녕하세요! 오늘은 프로그래머스 문자열 내 p와 y의 개수, 문자열 내림차순으로 배치하기, 문자열 다루기 기본 세문제를 풀어보았습니다! 1. 문자열 내 p와 y의 개수 문자열 내 p, P, y, Y의 개수를 비교하는 문제입니다. String[String.index(String.startIndex, offsetBy: index)]를 이용해 문자열의 한글자씩 가져올 수 있습니다. 이를 통해 P와 p 그리고 Y와 y의 개수를 counting해 같으면 true 다르면 false를 리턴해주면 됩니다! import Foundation func solution(_ s:String) -> Bool { var ans:Bool = false var count = s.count var pCount = 0, yCount = ..

[프로그래머스] [1차] 비밀지도, 가운데 글자 가져오기 with Swift

안녕하세요. 오늘은 프로그래머스 [1차] 비밀지도, 가운데 글자 가져오기 문제를 풀어보았습니다. 1. [1차] 비밀지도 비밀지도는 아직 Swift 문법이 어색해서 살짝 시간이 오래걸렸는데요! 문제 자체는 참 간단합니다! 비트연산자 &, | 를 이용해서 문제를 풀 수 있는데요. 처음에 1번지도와 2번지도를 합칠때는 OR 성질을 이용해 둘 중하나라도 1이면 1이 되도록해 지도를 겹쳐주는 역할을 합니다! 다음번에는 encoding을 하면 되는데요. 2진수를 문자열로 변환하는 과정을 한방에 하는 방법은 떠오르진 않았고 for문으로 1일때는 # 0일때는 공란이 들어가도록 코드를 구현하였습니다. 구현 방법은 &연산자를 이용해서 구현하였습니다! 😄 func solution(_ n:Int, _ arr1:[Int], _..

[프로그래머스] 최소직사각형, 나머지가 1이 되는 수 찾기, 부족한 금액 계산하기 with Swift

안녕하세요! 오늘은 최소직사각형, 나머지가 1이 되는 수 찾기, 부족한 금액 계산하기 문제를 풀어보았습니다. 오늘부터는 요즘 공부하고 있는 Swift를 이용해서 문제를 풀 예정입니다! 1. 최소직사각형 최소직사각형 문제는 직사각형 안에 카드를 모두 넣을수 있는 카드지갑의 크기를 구하는 문제입니다! 카드지갑 모양이 width가 길고 height가 짧도록 한다고 생각하고 주어진 카드의 긴 부분이 maxWidth와 비교해서 가장 길면 maxWidth를 초기화해주는 것을 반복하고 짧은 부분이 maxHeight와 비교해서 가장 길면 maxHeight를 초기화해주는 것을 반복해 width와 height를 결정하고 곱한 것을 return 해주면 됩니다. import Foundation func solution(_ s..

[프로그래머스] 예산, 두 개 뽑아서 더하기, 2016년

안녕하세요. 오늘은 프로그래머스 예산, 두 개 뽑아서 더하기, 2016년 문제를 풀어보았습니다! 문제 난이도가 낮아서 3문제를 한번에 포스팅하려고 합니다! 1. 예산 예산문제는 간단한 sort 문제입니다. vector d를 sort후 for문을 돌면서 예산에서 vector d의 값을 예산에서 깍아나가면서 result값을 늘려주면 됩니다! #include #include #include using namespace std; int solution(vector d, int budget) { int answer = 0; sort(d.begin(), d.end()); int size = d.size(); for (int i = 0; i = d[i]) { answer..

[프로그래머스] 약수의 개수와 덧셈, 3진법 뒤집기

안녕하세요! 오늘은 프로그래머스의 약수의 개수와 덧셈, 3진법 뒤집기 두문제를 풀었습니다! 둘다 문제가 간단해 한번에 포스팅하려고 합니다! ㅎㅎ 1. 약수의 개수와 덧셈 약수의 개수와 덧셈 문제입니다. 우선 약수의 개수를 구해야하죠? 약수의 개수를 구하는 함수를 구현하였는데요. 약수를 찾는 법은 간단하게는 모듈로 연산자를 이용해서 구할수 있는데요! 자신보다 작거나 같고 1보다 같거나 큰 수 중 모듈로 했을때 0이면 약수입니다! 이렇게 함수를 만들고 for문 내부에서 if-else문으로 answer에 더할지 뺄지 결정하면 됩니다! #include #include #include int calcFactorCount(int number) { int result = 0; for (int i = 1; i

[프로그래머스] 폰켓몬, 실패율

안녕하세요! 오늘은 폰켓몬과 실패율 두 문제를 풀어보았습니다! 나날이 벡터 사용법에 익숙해지고 있는듯하네요! ㅎㅎ 폰켓몬은 문제자체가 간단하죠? 등장한 종(부여된 숫자)과 size/2중 작은거 고르면 되는 문제였습니다! 실패율은 쪼오오오끔 어려웠는데요! map, pair, sort쓸줄 알면 쉽게 풀수 있는 문제였습니다!(이상하게 해쉬관련은 문제푸는데 오래걸리더라구요 ㅠㅠ 아직 구력이 부족한가 봅니다 ㅠㅠ) 음 cmp를 주석과같이 람다식으로 해도 되는데 보기좋게 함수로 했습니다! 레벨1 문제는 알고리즘을 잘 알고 있다기 보다는 역시 그냥 stl잘쓰느냐 문제가 더 많은듯 합니다! iterator가 안익숙하시면(익숙해지길 바래요!) for문 주석 쳐놓은 부분처럼 쓰셔도 무관합니다! 그리고 int 연산해서 do..

[프로그래머스] 코딩테스트 연습 탐욕법(Greedy) 체육복

안녕하세요! 오늘은 프로그래머스 레벨1문제 체육복 문제를 풀어보았습니다! 이번에도 정렬이 들어가 알고리즘을 인클루드해서 사용했습니다! 흠... 이번문제는 이상하게 안풀려서 고생을 좀 했는데요! 바로 윗줄에서 말씀드린 정렬이 없어서 생긴 문제였습니다! 정렬이 되지 않아 최대한으로 빌릴수 있는 체육복 수가 아니였던 것으로 결론이 났습니다! 다들 문제 푸실때 예외상황에 대한 인지를 정렬과 관련해서 한번 더 생각하는것도 좋은 방법일 듯합니다! 나머지는 그냥 일반적인 문제 풀이 방법이였습니다! 그리고 이 문제가 그리디 알고리즘이랑 관련이 있는지 잘 모르겠네요 ㅎㅎ...(제가 초보라서 그런듯합니다 ㅠㅠ) #include #include #include using namespace std; int solution(i..

[프로그래머스] 코딩테스트 연습 정렬 K번째수

안녕하세요! 오늘은 프로그래머스 K번째수 문제를 풀어보았습니다! 이전 포스팅이랑 마찬가지로 algorithm에 있는 sort func을 이용해서 문제를 해결해 보았습니다! for문을 이용해서 cuttedArray를 만들어서 그 Array를 정렬하고 거기에서 k번째 수를 answer 벡터에 push_back해주는 것으로 간단하게 문제를 풀 수 있습니다! 여려 방법으로 문제를 접근할 수 있을것 같네요 다들 한번씩 다른 방법으로 도전해보는 것도 좋아 보입니다! #include #include #include using namespace std; vector solution(vector array, vector commands) { vector answer; int size = commands.size(); f..