상근이가 감옥의 각 좌표로 이동하는 최단 경로
죄수 1이 밖으로 나가는 최단 경로
죄수 2가 밖으로 나가는 최단 경로
이 셋을 더한 데이터 중 최솟값을 찾으면
중복하여 문을 여는 경우는 생기지 않는다.
최솟값이 아니면 문이 중복되거나 최단 경로가 아니니까 무의미한 데이터.
도착지가 문일 경우에만 -2를 해주면 된다
0,1 bfs 알고리즘은 무엇인가?
가중치가 0 또는 1인 그래프에서
최단 경로를 찾을 때
0이면 deque의 앞에 넣어서 바로 처리,
1이면 deque의 뒤에 넣어서 나중에 처리
하게 만드는 알고리즘.
같은 비용이면 같은 레벨 취급.
답지 보고 대충 이해는 함
함수형 언어에서 변수는 변경되지 않는다.
가변 변수가 유발하는 것들
즉, 동시성 응용 프로그램에서 마주치는 모든 문제는 가변 변수가 없으면 절대로 안 생긴다.
불변성과 관련된 가장 주요한 타협 중 하나는 서비스를 가변 컴포넌트와 불변 컴포넌트로 분리하는 일.
최대한 많은 처리를 불변 컴포넌트로 옮겨야 하고, 가변 컴포넌트에선 최대한 많은 코드를 빼내는게 좋다.
이벤트 소싱 : 가변 변수에 상태 저장하지 말고 트랜잭션을 죄다 저장한다. 상태가 필요해지면 상태 시작점부터 모든 트랜잭션 처리한다. 이러면 응용 프로그램을 완전한 함수형으로 만들 수 있다.
결론
단일 책임 원칙은 모든 모듈이 단 하나의 일만 해야 한다는게 아니다.
단일 모듈은 변경의 이유가 오직 하나뿐이어야 한다는 것이다.
다시 말하면, 하나의 모듈은 오직 한 집단에 대해서만 책임져야 한다는 것이다.
예시
Employee 클래스가 각각 회계팀, 인사팀, 개발팀에서 사용하는
급여계산(), 시간보고(), 저장() 기능을 갖고 있다면
회계팀에서 결정한 조치가 인사팀이 의존하는 무언가에 영향을 줄 수 있다.
변경사항이 충돌하여 병합이 더 자주 일어난다. 그리고 병합은 언제나 위험하다.
해결책
다양한 해결책이 있겠지만, 모두 메서드를 각기 다른 클래스로 이동시키는 방식이다.
가장 확실한 해결책은 데이터와 메서드를 분리한다.
개발자가 세 가지 클래스를 인스턴스화하고 추적해야 한다는 단점이 있다.
퍼사드(Facade) 패턴을 사용해 이를 보완할 수 있다.
(EmployeeFacade에 코드는 거의 없고, 세 클래스의 객체를 생성하고 요청된 메서드를 가진 객체로 위임한다)
어떤 개발자는 가장 중요한 업무 규칙을 데이터와 가깝게 배치하는 방식을 선호한다.
이 경우라면 가장 중요한 메서드는 기존의 Employee 클래스에 그대로 유지하고,
Employee 클래스를 나머지 덜 중요한 메서드들에 대한 퍼사드로 사용할 수도 있다.