백준 11

백준/5430번, AC/C++

백준 5430번 AC c++ 문제풀이 문제 설명 배열이 주어지면 해당 배열을 뒤집거나(R), 처음 숫자를 버리는 연산(D)을 시행한 뒤 최종 결과를 출력한다. 주의할 점 실제로 배열을 뒤집을 생각을 하면 시간초과의 길로 빠지게 된다. 배열의 실제 순서는 상관 없다는 것을 깨달으면 문제가 비교적 쉽게 풀린다. c++의 string에는 split 함수가 없기 때문에 직접 구현하거나, find를 써야 한다. 입력형태가 독특하다는 점을 유의해야 한다. 생각의 흐름 배열을 매번 뒤집으면 시간 초과가 날테니까 덱을 써서 현재 진행 방향에 따라 front나 back으로 다르게 접근하는 게 좋겠다. 비어있는데 에러인 경우나 진행 방향은 bool형 변수를 두어서 확인해야겠네 split 없는데 직접 구현하기 귀찮다.. 근..

백준/1620번, 포켓몬 마스터/C++

백준 1620번 '나는야 포켓몬 마스터 이다솜' 문제 설명 포켓몬의 번호와 포켓몬의 이름을 저장해둔 후, 문제에서 포켓몬의 이름이 주어지면 그 포켓몬의 번호를 출력하고, 포켓몬의 번호가 주어지면 이름을 출력해야 하는 문제이다. 첫 번째 줄에는 포켓몬의 개수 N과 맞추어야 하는 문제 개수 M이 주어지고, 이어서 N줄에 걸쳐 1번부터 N번까지의 포켓몬 이름이 주어진다. 그 후에는 이어서 M줄에 걸쳐 포켓몬의 이름 혹은 번호가 주어진다. 주의할 점 포켓몬 개수의 최대범위가 10만이기 때문에, 시간초과에 유의해야 한다. 포켓몬 번호는 1번부터 N번까지이다. 코드 #include #include using namespace std; map s; map s2; int N, M; int main(voi..

백준/13458번, 시험 감독(연산)/C++

시험장마다 한 명의 총감독관과 여러 명의 부감독관이 있을 수 있을 때, 응시생을 모두 감시하는 데에 필요한 최소 감독관 수를 구하는 간단한 연산 문제이다. 주의할 점 1. 빼기의 반복은 나누기이다. 2. 최대범위를 고려하여 데이터타입을 정하자. #include #include #define MAX 1000000 using namespace std; int N, B, C; int p[MAX]; int main(void) { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int x = 0; long long sum = 0; cin >> N; for (int i = 0; i > p[i]; } cin >> B >..

백준/1969번(Greedy)/C++

주의할 점 : DNA s1,s2....sn 중 Hamming Distance의 합이 가장 작은 DNA si를 찾는 것이 아니라, 가장 작은 DNA s를 구하는 것이다. 처음에 문제를 잘못 이해해서 잘못 풀었다. #include #include #include using namespace std; int n, m; string s[1001]; char result[1001]; int ncount[4]; int main(void) { cin >> n >> m; for (int i = 0; i > s[i]; } int hammingD = 0; for (int i = 0; i < m; i++) { fill(ncount, ncount + 4, 0); for (int j = 0; j ..

백준/1541번(Greedy)/C++

마이너스가 한 개라도 나온 이후에는 무조건 빼줘야 한다는 점을 파악하면 쉽게 풀 수 있다. 디버깅 기록 : 필요했던 것 1. 문자열에 포함되어 있는 상수를 어떻게 변형시킬 것인지. stoi함수를 이용하는 방법도 있고, char에서 '0'을 뺀 후 일일이 10배씩 해주는 방법도 있다. 2. 마지막 처리. for문에서 마지막 시행을 제외시키는 방법도 있고, '\0'문자를 이용해 for문 안에서 따로 처리하는 방법도 있다. 3. boolean 변수 사용. boolean 변수같은 경우는 해당 변수가 true일 때 어떤 상태를 의미하는지까지 잘 전달해야 한다. 다음에는 더욱 유의할 것.

백준/1138번(Greedy)/C++

그리디 문제는 대부분 문제를 있는 그대로 받아들이기보다는, 문제에서 요구하는 바를 제대로 한 번에 구할 수 있는 방법을 간파해야 해서 까다롭다. 그게 한 번에 보이면 바로 풀리는데, 그렇지 않으면 이 문제처럼 계속 틀리게 된다. 디버깅 기록 : 작은 수부터 위치를 찾는다면, 아직 비어있는 위치는 자신보다 큰 수가 올 예정이라는 것을 알 수 있다. 따라서 맨 앞부터 훑으면서 아직 원소가 들어가 있지 않은 자리의 개수를 세어서 입력받은 수와 일치된 후에 원소를 삽입하면 된다. 작은 수부터 위치를 찾아야 한다는 점, 입력 위치를 찾는 수의 입장에서 아직 비어있는 자리는 내가 들어가지 않는 이상 나보다 큰 수가 위치할 자리라는 점을 파악해야 풀 수 있다.

백준/1504번(최단 경로)/C++

필수로 지나야 하는 정점이 두 개 주어지는 최단 경로 문제. 주의할 점: 필수 정점의 순서는 주어지지 않는다. v1을 먼저 가도 되고, v2를 먼저 가도 된다. #include #include #include #include #define MAX 805 #define INF 98765432 using namespace std; int N, E, v1, v2; vector graph[MAX]; int d[MAX]; void init() { for (int i = 1; i > N >> E; for (int i = 0; i > a >> b >> c; graph[a].push_back(make_pair(b, c)); graph[b].push_back(make..

백준/1753번(최단 경로)/C++

Dijkstra 알고리즘을 활용해볼 수 있는 간단한 문제 주의할 점: 1. 가중치가 가장 작은 간선을 구할 때, 직접 비교하면 시간이 초과하므로 우선순위큐를 활용한다. 2. cin,cout은 scanf,printf보다 오래 걸린다. #include #include #include #define MAX 20010 #define INF 987654321 using namespace std; int V, E, start; vector a[MAX]; int d[MAX]; void dijkstra() { priority_queue pq; d[start] = 0; pq.push(make_pair(0, start)); while (pq.empty() == 0) { int current = pq.top().second..

백준/11729번(하노이타워 재귀)/C

재귀함수 구현 연습을 해볼 수 있는 간단한 문제 #include #include void hanoi_rec(int from, int mid, int to, int x) {//하노이 함수 if (x == 1) { printf("%d %d\n", from, to); } else { hanoi_rec(from, to, mid, x - 1); printf("%d %d\n", from, to); hanoi_rec(mid, from, to, x - 1); } } int main(void) { int n; scanf("%d", &n); int execution; execution = pow(2, n) - 1;//시행 횟수 출력 printf("%d\n", execution); hanoi_rec(1, 2, 3, n); ..