본문 바로가기

반응형

알고리즘/BOJ

1316번 1316번 - 그룹 단어 체커 다양한 방법으로 풀 수 있었는데 , map 을 연습하기 위해서 풀어보았다. 조건은 간단하게 처음보는 단어면 map을 체크해주고, 처음 보지 않는 단어일 경우, 이전 단어와 같은지 여부만 파악해서 ans 를 늘려가면 된다. 123456789101112131415161718192021222324252627282930313233343536373839404142#include#include#includeusing namespace std; int main(){ int n,ans=0; cin>>n; while(n--) { string tmp; bool chk=true; map m; cin>>tmp; for(int i=0;i 더보기
1327번 1327번 - 소트 게임 BFS로 문제를 풀었다, 예전에 3x3 짜리 비트마스크 문제랑 유사하다고 느껴졌다. N의 값이 작기도 하고, int 형으로 구하기 귀찮아서 string 과 map 을 이용해서 문제를 풀었다. map 을 평소 BFS에서 dist 배열과 visited 배열을 섞은 것처럼 사용하였다. 목표값과 시작값을 정해놓고 BFS를 돌리면서 목표값이 나오면 while 문을 빠져나오도록 했다 또 change 함수에서는 특정문자와, 특정 위치를 인자로 받고, 그 부분만을 reverse 해서 string 값을 반환하도록 만들었다. 그리고 만약 값이 존재하지 않는다면 -1을 출력하도록 하였다. 비트 마스크로 푸는 방법을 알아봐야 겠다. 12345678910111213141516171819202122232.. 더보기
11000번 11000번 - 강의실 배정 처음에 우선순위큐를 쓰는게 좋다는 생각이 들었고, sort 를 하고 시간변수를 선언하는 로직으로 풀면 될 것이라고 생각했다. 그래서 처음에 while문과 for문을 쓰고 time 이란 변수를 1씩 증가시키면서 모든 시간을 체크했는데, 문제에서 시간 제한이 10^9이므로 당연히 시간초과가 발생했다. 그러고 나서는 시간을 1씩 증가시키지 않고, 가장 빨리 시작하는 강의로 넘어가면서 했는데도 시간초과가 발생했다. while 문과 for문을 써서 시간초과가 발생할 수 밖에 없는 구조였다. 한참을 고민하닥 갓들의 코드를 참고했다... 하지만 생각해보면 while문을 쓰는 이유가, 시간을 앞에서 부터 오름차순으로 증가시키기 위함이었다. 그런데 이미 나는 sort 를 해놓았기 때문에, 따.. 더보기
1152번 1152번 - 단어의 개수 string 변수를 cin으로 받게 되면 공백이 입력이 되지 않는 다는 것을 알았다. string 변수를 공백까지 포함해서 입력받기 위해서는 getline 함수를 써야한다는 점 을 배웠다. 단어가 나타날 때 마다 숫자를 체크해주면 된다. 123456789101112131415161718192021222324252627282930#include#includeusing namespace std; int main(){ string s; int ans = 0, chk = 0; getline(cin, s); for (int i = 0; i= 'a' && s[i] = 'A' && s[i] 더보기
3671번 3671번 - 산업 스파이의 편지 일단 숫자가 최대 7자리 이기 때문에 재귀를 통해서 풀 수 있을 거라고 생각했다. 또한 소수를 구하는 방식은 에라토스테네스의 체보다 그냥 그때 마다 구해서 문제를 풀었다. 0을 처리하기가 귀찮아서 string 으로 수를 만든 후 stoi 함수를 써서 문제를 풀었다. 각자 선택할지 안할지도 정해야 하고, 또한 앞 뒤 순서도 정해야 하기 때문에 check 값을 통한 백트래킹과 for문을 이용해서 재귀를 구현했다. 근데 예외처리 할 부분이 많아서 여러번 손을 봐야했고.. 약간 시간이 오래 걸리는 것 같다 더 정확하고 깔끔한 풀이를 위한 다른 사람들 코드를 좀 답습해야겠다. 1234567891011121314151617181920212223242526272829303132333.. 더보기
3407번 3407번 - 맹세 이 문제 거의 이틀을 잡고 있었다... 재귀로 풀다가 시간초과.. 그래서 다시 고치면서 풀었더니 메모리 초과로 계속 골머리를 앓았다. 그래서 백준 슬랙을 통해서 갓님들의 피드백을 구했고, 어떤 갓님께서 직접 전화 통화로 설명해주셨다. 사실 생각보다 굉장히 심플했다, 내가 아주 복잡하게 파고들다 보니 그 속에 갇혔던 것 같다. 결국 마지막에 복기해보니, 나는 중간에 check를 해주는 처리를 해주지 않았다는 것을 깨달았다. 문자를 만들어갈때, 만약 map 을 통해 중복되는 문자를 체크하면 어땠을까 싶다. 즉 어떻게 해서든 한 단어를 만들어냈다면, 그 과정은 중요하지 않기 때문이다. 그 다음만을 생각하면 된다. 나는 계속 단어를 처음부터 만들어내는 방식으로 문제를 풀었고, 그러다보니 체크.. 더보기
1342번 1342번 - 행운의 문자열 각 문자열의 갯수를 세고, 앞의 문자랑만 다르게 하면서 재귀함수를 이용해서 구현하면 된다. 백트래킹 문제 123456789101112131415161718192021222324252627282930313233343536373839404142434445#include#includeusing namespace std;int cnt[26];int ans = 0; void go(int n,int p){ if (n == 0) { ans += 1; return; } for (int i = 0; i 0 && i!=p) { cnt[i] -= 1; go(n - 1, i); cnt[i] += 1; } } }int main(){ ios::sync_with_stdio(false); cin.tie(.. 더보기
2210번 2210번 - 숫자판 점프 로직은 숫자를 string을 이용해서 만들고 stoi 함수를 이용해서 만들었다. (10^6을 곱하고 이런는게 귀찮아서) 그리고 6자리 숫자를 만들었는지 안만들었는지 확인하는 check 함수를 만들었다. 5x5 이기 때문에 출발하는 한칸에서 네방향을 5번 해야되므로 4^5 * 25칸이므로 시간안에 충분히 통과할 수 있다고 생각했다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465#include#includeusing namespace std;int map[5][5];bool check[1000000];int dx.. 더보기

반응형