3443 - Maximum Manhattan Distance After K Changes
정보
- 문제 보기: 3443 - Maximum Manhattan Distance After K Changes
- 소요 시간: 39분 9초
- 풀이 언어:
java
- 체감 난이도: 3️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
수학
풀이 코드
정보
- 메모리: 45670 KB
- 시간: 47 ms
class Solution {
public int maxDistance(String s, int k) {
char[] sArr = s.toCharArray();
int N, S, E, W;
N = S = E = W = 0;
int ans = 0;
for (int i = 0; i < sArr.length; ++i) {
char ch = sArr[i];
if (ch == 'N') ++N;
else if (ch == 'S') ++S;
else if (ch == 'E') ++E;
else ++W;
int d1 = Math.abs(N - S);
int d2 = Math.abs(E - W);
int md = d1 + d2;
int cand = md + Math.min(2*k, i+1-md);
ans = ans < cand ? cand : ans;
}
return ans;
}
}
풀이 해설
문자열의 각 방향 문자에 대해 순차적으로 좌표를 이동시킬때, 최대 순간 Manhattan Distance를 구하는 문제이다.
풀이할 때 여러 시도를 해보았는데 그리디하게 '우리팀', '상대팀' 나눠서 처리하는 것은 WA이다.
대부분 어느 한 세력 (ex. N < S 또는 E > W) 크기가 확실하게 더 크면 해당 팀을 k
로 지원하는게 먹히기는 한데
세력의 크기가 같을 때가 애매해서 문제이다.
처음엔 예제 TC를 고려해서 먼저 등장하는 녀석을 우리팀으로 지정해보았는데 그것도 WA였다.
반례
WEEW
1
답: 3
왜냐하면 상단의 반례에서 E와 W는 세력의 크기가 같지만 먼저 등장하는 W의 편을 들어주면 3이 나올 수 없기 때문이다.
그래서 아예 발상을 다르게 해야 하는데...
마법의 한 줄
for (int i = 0; i < sArr.length; ++i) {
...
int d1 = Math.abs(N - S);
int d2 = Math.abs(E - W);
int md = d1 + d2;
int cand = md + Math.min(2*k, i+1-md);
ans = ans < cand ? cand : ans;
}
우선 k
를 고려하지 않은 Manhattan Distance(이하 md
)를 구한 뒤, 후처리로 k