본문 바로가기

반응형

알고리즘/BOJ

2548번 2548번 - 대표 자연수 N제한이 2만이고 이중 포문으로 풀었기 때문에 시간초과가 발생하지 않을까 했는데 발생하지 않았다.. 그래서 다른 분들 코드를 보니까 엄청 간단하게, 정렬후 중간값보다 조금 작은 값으로 하는데 잘 이해가 가지 않았다. 그래서 백준 SLACK 을 통해서 물어보니 y = |x-1| + |x-3| + |x-6| 의 그래프를 x=3 일때 최소값이다는 것을 생각해보라는 갓님의 말... 한방에 이해가 갔다. 문제 푸는 속도가 굉장히 많이 차이가 났다.. 12345678910111213141516171819202122232425262728293031#include#includeusing namespace std; int n, ans, MIN = 1987654321;int num[20001];.. 더보기
15312번 15312번 - 이름 궁합 나는 큐를 사용해서 문제를 풀었다. vector 나 배열을 사용해도 되지만 크기를 줄여나가야 하기 때문에 큐가 적합할 거라고 생각했다. 로직은 큐에 처음에 글자들의 개수를 담는다. 만약 예시처럼 6 2 5 4 5 이렇게 담겼다면 6 을 꺼내고 팝시켜서 6을 없애고 2를 꺼내서 두수를 더하고 그 값을 큐에 넣는다. 그 다음에는 2를 꺼내고 팝 시켜서 2를 없애고 5를 꺼내서 두수를 더하고 그 값을 큐에 넣는다. 이런식으로 큐의 크기가 2가 될때까지 줄여준다. 그리고 마지막에 큐 값 두개를 꺼내서 출력하면 된다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152.. 더보기
1076번 1076번 - 저항 숫자의 범위와 string 문자열을 잘 사용하면 쉽게 풀 수 있는 문제. 처음에 stoi 함수를 쓰려다가 int 범위를 벗어나는 것 같아서 , 문자 3개를 전부 입력 받고 for문에서 맨마지막 문자열부터 시작해서 숫자를 맞춰나갔다. stoi 처럼 string 을 long long 으로 바꾸는 함수는 없는가? => 찾아보니 stoll 이 존재했다.. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include#include#includeusing namespace std; string om[10] = { "black","brown","red","orange","yello.. 더보기
1010번 1010번 - 다리놓기 D[n][m] = 왼쪽n개,오른쪽m개 있을 때 놓을 수 있는 다리의 경우 라는 점화식을 세워서 문제를 풀었다. 기저 조건으로는 - 왼쪽에 세울 다리가 남았는데, 오른쪽 다리가 부족한 경우 return 0 - 왼쪽에 세울 다리가 없을 때, return 1; for문을 통해서 왼쪽과 오른쪽을 연결하는데, 오른쪽으 가장 위쪽부터 아래로 내려가게끔 연결시켰다. 풀고 다른 분들을 보니 그냥 조합의 갯수를 구해서 바로 푸셨다.. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#include#includeusing namespace std;int D[31][31.. 더보기
1005번 1005번 - ACM Craft 다익스트라 알고리즘을 이용해서 문제를 풀 수 있었다. 위상정렬을 이용해서도 풀 수 있을 것 같다. (위상정렬 기억이 흐릿해서 인지 다익스트라가 끌렸다. -> 위상정렬 다시 공부) 결국 맨마지막 목적지에서 다른 목적지까지 거리를 모두 구하고, 그 거리의 최대값을 출력하면 된다(단, 가지 못하는 곳 제외) 만약 건물 X->Y라고 한다면 나는 간선을 Y->X로 주었다. 그리고 주어진 시간 값들을 우선 음수로 변경해서, 다익스트라 알고리즘을 사용했다. 그렇게 되면 최단 거리를 구하는 다익스트라 알고리즘에서 최대값을 구할 수 있게 된다. 최대값을 구하는 이유는 시간은 결국 큰 값에 의해서 좌우되기 때문이다. 12345678910111213141516171819202122232425.. 더보기
1004번 1004번 - 어린 왕자 주어진 점이 원 안에 존재하는지를 따지면 된다. 즉 각 점과 모든 원들의 중심과의 거리를 구하고, 구한 값을 반지름과 비교한다. 반지름보다 작다면 원안에 존재한다는 것이고, 반지름보다 크다면 원 밖에 존재하는 것이다. 원 밖에 존재하면 겹치는 원은 없다고 문제에 나오기 때문에 어떤 방식으로든 피해서 목적지에 도달 할 수 있다. 따라서 원 안에 존재하게 될때 진입/이탈이 이루어지는데 그 갯수를 세주면 된다. 단 한 원안에 출발점과 목적점이 둘다 존재한다면, 그 값은 카운트 하지 않는다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include#includeusi.. 더보기
1002번 1002번 - 터렛 처음에는 범위안의 모든 값을 구하는 건줄 알았는데 문제를 잘 읽어보니, 반지름과 중심을 이용한 수학문제였다.. 중심이 겹칠때, 중심이 겹치지 않을 때 나누면 겹칠때 - 반지름의 합이 중심거리와 같으면 무한대, 아니면 0 안 겹칠 때 - 0개인 경우 -> 아주 멀리 떨어져 있거나, 아주 큰 원이 작은 원을 품고 있거나 - 1개인 경우 -> 중심의 거리와 반지름의 거리가 같을 때, 혹은 아주 큰 원과 작은 원이 내접해서 한점 - 2개인 경우 -> 그 외 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253#include#includeusing namespace std;.. 더보기
1874번 1874번 - 스택 수열 스택을 k로 표현하고, 수열을 order 배열에 집어넣어서 시뮬레이션 처럼 맞췄다. order 배열의 해당하는 i 번 인덱스와 비교해서 작으면 k 값을 push 시켜서 맞추고 pop 시킨다. push , pop 을 할 때에는 이미 써버린 숫자면 그냥 지나치도록 k++ 나 k-- 를 해준다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768#include#include#includeusing namespace std;int order[100001];bool num[100001];int n, k;vector.. 더보기

반응형