15686번 - 치킨 배달
허허..
리눅스 eclipse로 돌리는 것도
ideone에서도 돌리는 것도 정답이 나오는디/..
어디서 반례가 생기는지 도저히 모르겠네요..
로직은 다들 비슷하다시피
배열 입력 받고
치킨집의 좌표를 저장하는 pair<int, int> 벡터 하나 따로 두고
문제의 배열을 입력 받으며 2가 나오면 치킨집 좌표 벡터에 해당 좌표를 넣고 cnt를 올립니다.
치킨 거리 최소 되려면 M보다 작은 수에서도 나올 수 있겠지만
M이어도 어차피 그 값 나오거나 더 적게 나오니까 (최소값이 되는 최소 치킨집 수를 구하는 게 아니므로)
전체 치킨집 수 cnt에서 M개를 구하는 조합을 돌립니다.
치킨이 있던 곳 중 M개를 0으로 바꾸고
배열을 쫙 돌면서 1인 거 발견하면
그 위치에서부터 레이다 음파 쏘는 것마냥 거리를 1부터 하나하나 벌리면서 주변 테두리 사각형만 딱 조사했습니다.
거기서 최소값을 딱 받아서 뭔가 발견되면 그 자체적으로도 min값과 비교합니다.
사각형 테두리에 두 개 이상 있더라도 각각 거리가 다를 수가 있기 때문에 최소만 가져와야 하기 때문이죠.
그리고 거리를 넓히기 전에 만약 치킨집이 발견이 됐다면 더이상 넓히지 않고 탐색을 종료합니다.
왜냐면 제일 가까운 치킨집이 발견됐으므로 더 이상 탐색할 필요가 없기 때문에..
하여간 이렇게 해서 1인 것들의 치킨 거리를 다 더한 다음에
min과 비교해서 적으면 저장하고 아니면 냅두고..
아까 0으로 바꿨던 치킨집 다시 2로 복구시키고
다시 조합으로 돌리고...
하는 게 제 로직입니다.
근데? 런타임 에러네용
배열 인덱스를 이리저리 넘나들어서 인덱스 초과가 나는 것도 아니고
delete 과정에서 뭐가 뻑나는 것도 아니고,,,,
어디서 런타임 에러가 나는지..?
같은 g++ C++14 컴파일러에서도 잘 되는데 백준 것만 안 되네요
댓글을 작성하려면 로그인해야 합니다.
jkjan 4년 전
허허..
리눅스 eclipse로 돌리는 것도
ideone에서도 돌리는 것도 정답이 나오는디/..
어디서 반례가 생기는지 도저히 모르겠네요..
로직은 다들 비슷하다시피
배열 입력 받고
치킨집의 좌표를 저장하는 pair<int, int> 벡터 하나 따로 두고
문제의 배열을 입력 받으며 2가 나오면 치킨집 좌표 벡터에 해당 좌표를 넣고 cnt를 올립니다.
치킨 거리 최소 되려면 M보다 작은 수에서도 나올 수 있겠지만
M이어도 어차피 그 값 나오거나 더 적게 나오니까 (최소값이 되는 최소 치킨집 수를 구하는 게 아니므로)
전체 치킨집 수 cnt에서 M개를 구하는 조합을 돌립니다.
치킨이 있던 곳 중 M개를 0으로 바꾸고
배열을 쫙 돌면서 1인 거 발견하면
그 위치에서부터 레이다 음파 쏘는 것마냥 거리를 1부터 하나하나 벌리면서 주변 테두리 사각형만 딱 조사했습니다.
거기서 최소값을 딱 받아서 뭔가 발견되면 그 자체적으로도 min값과 비교합니다.
사각형 테두리에 두 개 이상 있더라도 각각 거리가 다를 수가 있기 때문에 최소만 가져와야 하기 때문이죠.
그리고 거리를 넓히기 전에 만약 치킨집이 발견이 됐다면 더이상 넓히지 않고 탐색을 종료합니다.
왜냐면 제일 가까운 치킨집이 발견됐으므로 더 이상 탐색할 필요가 없기 때문에..
하여간 이렇게 해서 1인 것들의 치킨 거리를 다 더한 다음에
min과 비교해서 적으면 저장하고 아니면 냅두고..
아까 0으로 바꿨던 치킨집 다시 2로 복구시키고
다시 조합으로 돌리고...
하는 게 제 로직입니다.
근데? 런타임 에러네용
배열 인덱스를 이리저리 넘나들어서 인덱스 초과가 나는 것도 아니고
delete 과정에서 뭐가 뻑나는 것도 아니고,,,,
어디서 런타임 에러가 나는지..?
같은 g++ C++14 컴파일러에서도 잘 되는데 백준 것만 안 되네요