오늘의 과제
리트코드 medium으로 분류된 Minimum Suffix Flips 입니다.
이번 유형은 문자열 입니다.
문제
https://leetcode.com/problems/minimum-suffix-flips/description/
먼저 문제 요구사항 요약입니다.
모두 0인 이진 문자열이 있다고 가정하고 이 문자열을 target의 이진 문자열과 일치 시키려면 몇 번의 flip을 해야하는지 반환하면 되는 문제입니다.
문제만 이해하면 이번에도 굉장히 간단히 풀 수 있는 문제입니다.
먼저 반환할 answer 값과 뒤집어야할지 결정할 flip 변수를 선언합니다. 이후에는 주어진 target 문자열을 순회하며 flip 값과 target char 값을 비교하며 뒤집어주면 됩니다.
문제 조건에 보면 i번을 선택하면 그 뒤로는 한 번에 뒤집을 수 있다고 나와있으니 우리는 그냥 이미 뒤집은건 신경쓰지 않고 쭉 밀고 나가면 최적의 해를 찾을 수 있습니다.
핵심 검증 코드입니다.
for (char c : target.toCharArray()) {
if (c != flip) {
answer++;
}
flip = c;
}
문제의 예시로 같이 살펴보겠습니다.
target = "10111"
str = "00000"
flip = '0'
저희는 비교할 초기값을 0으로 셋팅 후 진행하겠습니다. 처음에 1을 만났으니 한 번 뒤집고 다음 값을 뒤집어야 할 지 검증해야 하기 때문에 flip 값을 이번 값으로 업데이트 해주겠습니다.
str = "11111"
flip = '1'
target의 다음 c 값은 '0'으로 또 flip의 '1'과는 다르기에 다시 뒤집어줍니다.
str = "10000"
flip = '0'
target의 다음 c 값은 '1'으로 또 flip의 '0'과는 다르기에 다시 뒤집어줍니다.
str = "10111"
flip = '1'
이미 str이 target과 동일해졌으니 값을 반환하면 됩니다. 총 세 번 뒤집었으니 3을 반환하면 되겠죠?
(00000 => 11111 => 10000 => 10111)
코드입니다.
class Solution {
public int minFlips(String target) {
int answer = 0;
char flip = '0';
for (char c : target.toCharArray()) {
if (c != flip) {
answer++;
}
flip = c;
}
return answer;
}
}
배운 점
오래 생각하지 않고 힌트를 먼저 보는 습관이 생겼으며 다양한 생각이 아닌 문제의 분류로 주어진 힌트에 집착하기 시작했습니다. 단기적으로 봤을 땐 많은 문제를 풀 수 있게 되겠지만 왜? 라는 사고력은 키워지지 않을 것 같아 좋은 습관은 아닌 것 같네요. 조금은 시간이 더 걸리더라도 혼자 고민하고 답을 도출해내는 연습을 해야겠습니다.
오늘의 한줄평
빠른 일처리도 중요하지만 한 발 물러나 보면 다른 해답도 보일 수 있다.
'알고리즘 > 항해99' 카테고리의 다른 글
99클럽 코테 스터디 32일차 TIL + 정렬(Top K Frequent Elements) (0) | 2024.06.20 |
---|---|
99클럽 코테 스터디 31일차 TIL + 문자열(Sort Characters By Frequency) (1) | 2024.06.19 |
99클럽 코테 스터디 29일차 TIL + 문자열(Iterator for Combination) (0) | 2024.06.17 |
99클럽 코테 스터디 28일차 TIL + 배열(Group the People Given the Group Size They Belong To) (1) | 2024.06.16 |
99클럽 코테 스터디 27일차 TIL + 배열(Subrectangle Queries) (0) | 2024.06.15 |