출처 : https://www.acmicpc.net/problem/11375

정답 : https://github.com/stemp12/study/blob/master/acmicpc.net/2016.07/11375.cpp


이문제는 네트워크유량 문제이다. 즉 이분매칭이다. 

요즘 나는 이분매칭에 흠뻑 취해있다고 해도 과언이 아닐것이다. 그도 그럴게 하도 많이 틀려서 빡쳤다..결국 DFS인데..

암튼 이문제는 저번에 푼 축사배정문제와 완전히 똑같다고할수있다. 결국 최대매칭을 구하는 문제인데 소스마저 똑같다.

인풋이 똑같기 때문이다. 그냥 코딩연습이라 생각하고 풀었다.

문제는 어렵지 않다.

'Algorithm' 카테고리의 다른 글

[AC] 11052 붕어빵 판매하기  (0) 2016.07.17
[AC] 2133 타일 채우기  (0) 2016.07.17
[AC] 1697 숨바꼭질  (0) 2016.07.17
[AC] 2805 나무 자르기  (0) 2016.07.12
[AC] 9933 민균이의 비밀번호  (0) 2016.07.12

출처 : https://www.acmicpc.net/problem/1697

정답 : https://github.com/stemp12/study/blob/master/acmicpc.net/2016.07/1697.cpp


이 문제는 간단한 BFS문제이나 나는 정말 정답을 맞지 못했다. 결국 맞긴했지만 어처구니없이 맞지 못하였기에 적는다. 

우선 문제는 x-1, x+1, x*2 이 3가지에 대해서 bfs를 돌리면 된다. 그런데 내가 놓친 부분은 중복을 계산하지 않았고 결국 메모리문제에 걸리게 되었다.

나중에 따로 중복체크하는 배열을 만들어서 확인을 하게 하였고 그후 정답을 맞았지만 어처구니없었다.

BFS에서 가장 중요한것은 중복체크인데 이 부분을 간과 하고있었다.

쉬운 알고리즘이기에 한동안 안했더니 바로 이런 실수를 하였다. 앞으로 간간히 해야겠다. 

'Algorithm' 카테고리의 다른 글

[AC] 2133 타일 채우기  (0) 2016.07.17
[AC] 11375 열혈강호  (0) 2016.07.17
[AC] 2805 나무 자르기  (0) 2016.07.12
[AC] 9933 민균이의 비밀번호  (0) 2016.07.12
[AC] 1707 이분 그래프  (0) 2016.07.11

출처 : https://www.acmicpc.net/problem/2805

정답 :  https://github.com/stemp12/study/blob/master/acmicpc.net/2016.07/2805.cpp


이 문제는 이진탐색 문제이다. 문제를 딱보니 DP아니면 이진탐색의 느낌이 강했고, 더 살펴보니 이진탐색 문제였다.

DP 문제가 아니라는건 뭔가 감이었다. 예전에는 이런 구분이 잘 안되었는데 이젠 그냥 뭔가 보인다.

 문제는 어떤 기점으로 잘랐을때 요구한 길이에 가장 근접하게 자르라는 말이다.  예전에 황소 울타리문제? 그거랑 비슷한거 같다.


접근은 다음과 같다.

1. 정렬한다.

2. 먼저 입력값을 통해 대강적인 위치를 찾는다. (지금 생각해보니 굳이 찾을 필요가 없다.) 대강적인 위치는 입력배열의 인덱스이다.

3. 해당 인덱스를 통해 left right값을 구하면 이제 값은 arr[left]<=정답<=arr[right] 인것이기 때문에 범위가 상당히 좁아졌다. 여기서부터는 인덱스가 아닌 값으로써 다시 검색을 한다.

4. 일치되는 값이 있으면 그 값을 리턴하고 없다면 middle을 가지고 다시 state함수를 호출하여 middle을 그대로 사용할지 아니면 -1을 해줘야할지 판별한다. 


이 문제를 풀면서 조금 졸렸고, 코드가 길어져 짜증나 계속 줄이려고했는데 생각해보니 몇몇의 개선점이 보인다.


1. state함수는 계속 합을 구하는 함수인데, 좀 더 생각해보면 처음 이진탐색이후 3번과정을 할때는 이미 arr[right]로 값이 변경된 시점에서 right는 고정이 되었으므로 한번에 합을 구하고 그 후부터는 인덱스가 변할때 그 차만큼 +1 혹은 -1을 해주면 되지 않았을까 싶다. 그러면 굳이 처음부터 끝까지 합을 구하는 과정이 많이 생략되었을거 같다. 뭐 어차피 로그시간대라서 그냥 무시하고 진행하였다...

2. 나는 이진탐색을 둘로 나누었는데 지금 생각하니 굳이 그럴 필요가 없는것 같다. 하나만두고 처음부터 값을 통해 찾았다면 더 나은 코드가 되지 않았을까 생각이 든다. 역시 졸릴땐 문제를 풀면 안되는것 같다. 코드가 더 간략해지고 깔끔해질수있었을텐데 하는 아쉬움이 남는다.

'Algorithm' 카테고리의 다른 글

[AC] 11375 열혈강호  (0) 2016.07.17
[AC] 1697 숨바꼭질  (0) 2016.07.17
[AC] 9933 민균이의 비밀번호  (0) 2016.07.12
[AC] 1707 이분 그래프  (0) 2016.07.11
[AC]2146 다리 만들기  (0) 2016.07.11

출처 : https://www.acmicpc.net/problem/9933

정답 : https://github.com/stemp12/study/blob/master/acmicpc.net/2016.07/9933.cpp


나는 문제 선정할때 제출 횟수와 정답률을 보고 난이도를 짐작한다. 그래서 문제를 선정하고 푸는데.. 이건 뭐지...

무척이나 쉽다. 그런데 제출에 비해 정답률이 엄청 낮다... 이유를 모르겠다.. 뭐 난해한것도 없고, 혼동되는 부분도 전혀 없다. 

문제는 단어가 입력으로 주어지는데 항상 홀수로 입력이 들어오고(중요하지 않다.) 그 중 하나의 단어는 역으로 돌리면 중복이 발생하는데 그 단어를 찾으라는 것이다. 즉 어떤 단어는 las가 오면 입력에 sal도 있고 이건 같은 단어로 보고 그 단어의 길이와 가운데 글자를 출력하라는 것이다.

해결책도 간단하다. 맵에다가 입력들어오는 모든 단어를 추가하는데 역으로 변환해서 한번 더 추가해준다. 그러면 결국 언젠가는 어떤 중복되는 단어가 발생할테고 그 값이 2라면 중복을 찾은것으로 간주하고 출력하면 된다.

내가 한번 틀린건 가운데 글자만 출력하게 프로그래밍을 해서 틀렸다. 틀릴 이유도 없는건데.. 모두들 나와 같은 실수를 한건가보다..

'Algorithm' 카테고리의 다른 글

[AC] 1697 숨바꼭질  (0) 2016.07.17
[AC] 2805 나무 자르기  (0) 2016.07.12
[AC] 1707 이분 그래프  (0) 2016.07.11
[AC]2146 다리 만들기  (0) 2016.07.11
[AC] 2161 카드1  (0) 2016.07.11

+ Recent posts