본문 바로가기

전체 글

(336)
프로그래머스 - 혼자 놀기의 달인 (C++) 그냥 미친 빡구현 문제다. 문제 해석이 가장 중요하다. 상자가 열려있는지 확인할 bool 배열한개, map으로 각 상자와 카드번호를 생성한다. 주의해야할 예외사항은 1. 그룹이 1개이면 무조건 0점이다. 2. 각 그룹의 값이 같을 수 있다. #include #include #include #include #include #define MAX 101 using namespace std; int solution(vector cards) { int answer = 0; bool open[MAX] = {false,}; vector group; map cardbox; for(int i = 0; i < cards.size(); i++){ cardbox.insert(make_pair(i + 1, cards[i]));..
백준 14503번 로봇 청소기 (C++) 골드 4정돈 되야할 것 같은데 골드5이다. 이 문제는 각 위치에서 따져야 할 것이 많다. 일단 4방향을 봐야하는데 순서가 정해져있고, 바라보는 방향까지 고려해야한다. 게다가 후진까지 한다; (가지가지한다) 그래서 각 위치에서 따져줄 수 있는 DFS 가 맞는 풀이법이다. 시간을 고려해서 문제에서 사이즈도 50까지 크지 않게 주었다. dfs에는 위치정보, 방향정보, 그리고 뒤로 돌아올때는 청소로 치지 않으니 돌아왔는지를 체크한다. dfs를 공부한다면 풀어보면 좋을 것 같은 문제이다. 백준에서는 개인적으로 100줄을 넘어가는 걸 안좋아하는데 방향을 따지고 방향에 따라 순서가 또 달라지니 코드가 길어졌다. 다른 사람들은 나머지연산으로 멋있게 풀었던데 난 그 생각은 나지 않아서 노가다로 모두 적어주었다. #inc..
백준 11866번 요세푸스 문제 0 (C++) 처음 봤을 땐 벡터를 사용할까 생각했다. 그러나 분류를 보니 큐가 있었다. 정말 이걸 왜 생각 못했을까, 이걸 코테에서 만났다면 멍청하게 삽질하다가 시간버렸을 것 같다. 아이디어는 간단하다. 1. 큐에서 front 부터 꺼내면서 K번째가 아니면 다시 큐에 쌓는다. 2. K번째이면 큐에 쌓지 않는다. 3. 큐가 빌 때 까지 반복한다. #include #include using namespace std; int main() { queue Q; int N, K; cin >> N >> K; for (int i = 1; i
백준 1475번 방 번호 (C++) 빡구현 문제다. 예외처리를 해주고 너무 쉽게 생각한 것이 문제였다. 처음엔 112233 이런식으로 들어오면 중복할때마다 카운트 1을 쳤다. 그러나 한 "세트" 가 들어오는데 계속 추가하면 비효율적으로 짜게되는 것을 생각해야한다. 그래서 배열을 만들어 각각 숫자가 몇개 들어오는지 파악하고 가장 큰 수의 세트를 현재 필요 세트라고 생각했다. 그리고 6,9는 함께 사용가능한 것도 생각해야한다. 처음에는 일일히 예외처리를 해주려 했다가 피를 봤다. 잘 생각해보면 6,9를 적절하게 분배하면 되는 거다. 왜냐면 6,9가 일단 0이 아니라면 세트가 존재한다는 것이기 때문이다. 세트가 존재하지 않으면 추가를 해준다. 틀린코드 : #include #include #include #include using namespac..
프로그래머스 - 멀리 뛰기(C++) 한칸 아니면 두칸 이동할 수 있다. 처음에는 여러가지 방법으로 한 곳으로 간다고 생각하고 백준 숨바꼭질 2를 떠올려 BFS로 구현했으나 #include #include #include using namespace std; bool visited[2001] = {false,}; queue Q; long long cnt = 0; void BFS(int n){ Q.push(0); while(!Q.empty()){ int X = Q.front(); Q.pop(); visited[X] = true; if(X == n){ cnt++; } if(X + 1
프로그래머스 - 콜라 문제(C++) 기본 수학 문제. 콜라의 수를 계속 갱신해가며 풀면된다. #include #include #include using namespace std; int solution(int a, int b, int n) { int answer = 0; int cola = 0; while(true){ cola = (n / a) * b; n = cola + n % a; answer += cola; if(n < a) break; } return answer; }
프로그래머스 - 로또의 최고 순위와 최저 순위(C++) 예외처리를 잘 해줘야하는 문제. 어려운 문제는 아니지만 예외처리가 어렵다. #include #include using namespace std; vector solution(vector lottos, vector win_nums) { vector answer; int numberArray[47] = {0,}; for(int i = 0; i < 6; i++) numberArray[win_nums[i]]++; int win = 0; int zero = 0; int wrong = 0; for(int i = 0; i < 6; i++){ if(numberArray[lottos[i]] != 0) win++; else wrong++; if(lottos[i] == 0) zero++; } if(wrong == 6){ i..
프로그래머스 - [1차] 다트 게임 문자열을 받아 처리하는 문제, 생각흐름은 다음과 같다. 1. 반드시 숫자, 알파뱃(S, D, T) 특수문자(*, #) 순으로 들어온다. 2. 바뀌는 건 숫자이다. 그러므로 숫자만 벡터에 추가해둔다. 3. 알파뱃이 들어오면 추가해둔 벡터의 숫자를 바꿔준다. 이때 인덱스 관리를 잘 해줘야한다. 난 지금 벡터 사이즈 - 1로 두었다. 4. 특수문자는 들어올 때도 있고 안들어올 때도 있다. 들어오면 이전 문자와 지금 문자를 처리해준다. 5. 예외처리로 10이 들어오면 1, 0 으로 확인되기 때문에 버그가 발생한다. 이때는 1이 들어오면 뒤의 문자가 0인지 판단하고 벡터에 10을 추가하는 예외 로직을 만들었다. 다른 사람들 풀이를 보니 sstream 을 사용하여 간단히 푼 사람도 있었고 regex? 을 사용한 사..