분류 전체보기 297

3-1. 새로운 할인 정책 개발

이번 시간에는, 할인 정책이 변경되었다고 가정하고 그 할인 정책에 맞게 코드를 수정해볼 것이다. 현재 코드는 VIP 고객에게 1000원을 할인해주는 방식으로 짜여져있는데, 오늘은 VIP 고객에게 구매 가격의 10%를 할인해주는 코드를 짤 것이다. src > main > java > hello.core > discount 패키지 안에 DiscountPolicy를 implement하는 RateDiscountPolicy를 하나 만들어준다. 코드는 다음과 같이 채운다. member 가 VIP라면 구매가격의 10%를 return하고, 그렇지 않으면 0을 리턴하는 함수를 만들었다. 여기서 기억할 것이 있다. 알고리즘 문제를 풀 때, 나눗셈 때문에 낭패를 본 경험이 있을 것이다. 나눗셈은 오차를 발생시킨다. 그러므로..

#10971 : 외판원 순회 2

풀이방법 사용된 것: 백트래킹 2022.11.29 오답노트 #10971 : 외판원 순회 2 풀이방법 및 문제점 2022.11.23 이번 문제도 작은 실수로 인해 틀렸던 문제이다. 백트래킹 문제를 풀 때 절대 잊으면 안 되는 사항이기 때문에 오답노트에 적어두려 한다. 재귀를 통해 각 도시를 방 blowupmomo.tistory.com 재귀를 통해 각 도시를 방문하다가, 모든 도시를 빠짐없이 방문한 것이 확인되면 출발지로 다시 돌아가는 비용을 현재까지 쌓인 비용에 더한 뒤 이번 여정의 최종 비용으로 결정한다. 단, 마지막으로 방문한 도시에서 출발지로 돌아가는 길이 없다면 이번 여정은 무효로 처리하고 정답에 반영하지 않는다. 그 다음 모든 최종 비용 값 중 최솟값을 화면에 출력하여 문제를 해결한다. 코드 Ja..

오답노트 #10971 : 외판원 순회 2

풀이방법 및 문제점 2022.11.23 이번 문제도 작은 실수로 인해 틀렸던 문제이다. 백트래킹 문제를 풀 때 절대 잊으면 안 되는 부분이기 때문에 오답노트에 적어두려 한다. 재귀를 통해 각 도시를 방문하다가, 모든 도시를 빠짐없이 방문한 것이 확인되면 출발지로 다시 돌아가는 비용을 현재까지 쌓인 비용에 더한 뒤 이번 여정의 최종 비용으로 결정하기로 하였다. 단, 마지막으로 방문한 도시에서 출발지로 돌아가는 길이 없다면 이번 여정은 무효로 처리하고 정답에 반영하지 않는다. 그 다음 모든 최종 비용 값 중 최솟값을 화면에 출력하여 문제를 해결한다. 이러한 풀이 방식은 잘 짠 것이었다. 단, 백트래킹 문제를 풀 때 꼭 기억해야 하는 사항 하나를 깜빡하여 틀렸었다. 백트래킹이란, 갔던 길을 되돌아오기를 반복하..

Spring으로 옷 세탁 정보 관리 웹사이트 만들기

java 기반 프레임워크 Spring을 이용하여 옷의 세탁 방법에 대한 정보를 관리하는 백엔드 시스템을 구현해보자. 백엔드 중심의 프로젝트이며, 프론트엔드는 기초적인 정도만 사용한다. 목차 요구사항 정리 시스템 구성의 이해 개발 환경 준비 스프링 부트를 이용한 프로젝트 생성 도메인 만들기 리포지토리 만들기 리포지토리 테스트 서비스 만들기 서비스 테스트 SpringConfig 파일을 이용한 스프링 빈 등록 컨트롤러 및 html 구현 최종 테스트 요구사항 정리 먼저 시스템의 요구사항을 정리하자. 우리는 무엇을 만드는가 우리가 만들 것은, 사용자가 자신이 가지고 있는 옷의 세탁 정보를 저장하고, 조회하고, 삭제할 수 있는 웹사이트이다. 옷 정보 객체는 어떻게 생겼는가 각 옷 정보 객체는 다음의 정보를 담고 있..

#4436 : 엘프의 검

풀이방법 사용된 것: 브루트포스 2022.11.22 오답노트 #4436 : 엘프의 검 풀이방법 및 문제점 2022.11.22 사용한 방법은 다음과 같다. 0부터 9까지의 숫자가 담겨있는 해시셋을 선언한다. 수열에 특정 숫자가 나타날 때마다 그 숫자를 해시셋에서 remove()한다. 해시셋이 텅 blowupmomo.tistory.com 0부터 9까지의 숫자가 저장된 HashSet을 선언한다. 각 숫자가 등장할 때마다 HashSet에서 그 숫자를 remove()한다. HashSet이 텅 비는 순간 현재의 k를 출력한다. 형변환의 번거로움을 줄이기 위해 각 숫자는 Character형으로 다루었다. 그리고 곱하기를 하다 보면 숫자가 점점 커지므로, 곱한 값은 반드시 충분히 큰 정수형 데이터로 선언해주어야 한다...

오답노트 #4436 : 엘프의 검

풀이방법 및 문제점 2022.11.22 사용한 방법은 다음과 같다. 0부터 9까지의 숫자가 담겨있는 해시셋을 선언한다. 수열에 특정 숫자가 나타날 때마다 그 숫자를 해시셋에서 remove()한다. 해시셋이 텅 비게 되면 그 시점의 k를 출력한다. 형변환의 번거로움을 줄이기 위해 각 숫자는 int나 long이 아닌 Character형으로 하였다. 완벽한 풀이법이라고 생각했는데 33퍼센트에서 자꾸 틀렸습니다를 받는다. 무엇이 문제지...? 친구가 한 것처럼 boolean 배열이 모두 true가 되었을 때 정답을 확정하는 코드도 짜보았는데, 똑같이 33퍼센트에서 틀렸습니다를 받았다. 이걸 보니 풀이법 자체가 문제가 아닌 것 같다. 친구가 했을 때 정답 처리를 받은 코드를 내 식으로 짜보니 오답 처리가 되었기 ..

#2246 : 콘도 선정

풀이방법 사용된 것: 정렬 브루트포스 Comparator Overriding 2022.11.17 콘도 X가 후보가 될 수 있는 조건은 다음과 같다. X보다 바닷가에 더 가까운 콘도들은 모두 X보다 숙박비가 더 비싸다. X보다 숙박비가 더 싼 콘도들은 모두 X보다 바닷가에서 더 멀다. 거리 순으로 정렬한 후에 1번 조건을 체크하고, 가격 순으로 정렬한 후에 2번 조건을 체크한 후, 두 번의 체크 과정에서 한 번도 탈락하지 않은 콘도들의 개수를 세면 된다. 다음과 같은 방법으로 구현하였다. 1. Condo 클래스 정의 각각의 콘도는 Condo 객체로 저장된다. Condo 객체는 다음의 3가지 필드를 가진다. 바닷가로부터의 거리 d, 숙박비 c, 후보가 될 자격을 나타내는 boolean 타입 변수 check ..

#1063 : 킹

풀이방법 사용된 것: 시뮬레이션 Queue 2022.11.14 문제에서 말해주는 상황을 그대로 시뮬레이션하기만 하면 되는 단순한 문제이다. 최대 움직임 수가 50번밖에 안 되므로 시간초과 걱정이 없기 때문이다. 기본적인 풀이 과정은 다음과 같다. 1. 킹의 최초 위치와 돌의 최초 위치를 읽어온다. 2. 모든 움직임 명령을 읽어와 순서대로 큐에 저장해둔다. 3. 큐에 넣은 명령들을 다음과 같은 과정을 따라 수행한다. - 이번 명령에 따라 킹을 이동하였을 때에 킹이 판 밖으로 나가는지 판별한다. 만약 킹이 나가게 된다면 아무것도 옮기지 않고 이번 명령을 종료한다. - 킹이 판 밖으로 나가지 않는다면, 킹이 옮겨갈 위치에 돌이 있는지 판별한다. 만약 그 위치에 돌이 없다면 킹만 옮기고 이번 명령을 종료한다. ..

오답노트 #7983 : 내일 할거야

풀이방법 및 문제점 2022.11.09 어이 없는 이유로 계속 실패하다가 오늘 해결에 성공한 문제이다. 이 문제를 풀 수 있는 완벽한 로직은 9달 전부터 알고 있었다. 그러나 그 때에는 Comparator를 아직 알지 못해, 매우 비효율적인 방식으로 값들을 정렬하였다. 그래서 시간초과를 받았다. 그리고 오늘 다시 도전하였다. 오늘은 Comparator를 아는 상태이기 때문에 시간초과는 받지 않았다. 그러나 for문에 break를 넣어서 틀렸다. 넣을 이유가 없는데 왜 넣었는지 모르겠다. 정말 멍청한 실수였다! break를 지우니 정답 처리가 되었다. 정답 게시글 바로가기 코드 Java(2022.01.22) 시간초과를 받은 코드 import java.util.Scanner; import java.util...

#7983 : 내일 할거야

풀이방법 사용된 것: 정렬 그리디 Comparator 2022.11.09 오답노트 #7983 : 내일 할거야 풀이방법 및 문제점 2022.11.09 어이 없는 이유로 계속 실패하다가 오늘 해결에 성공한 문제이다. 이 문제를 풀 수 있는 완벽한 로직은 9달 전부터 알고 있었다. 그러나 그 때에는 Comparator를 아직 알 blowupmomo.tistory.com 과제들을 마감일자가 가장 늦은 순으로 정렬한다. (가장 마감이 늦은 과제가 가장 앞에 오도록) 정답 값을 저장할 int 형 변수 ans를 선언하고, Integer.MAX_VALUE로 초기화한다. 그 후, 정렬되어있는 과제들을 앞에서부터 방문하며 아래를 반복한다. 이번 과제의 마감일자가 ans 값보다 큰 경우: ans = ans - (이번 과제를..