알고리즘 문제풀이 176

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

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

#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 - (이번 과제를..

#5545 : 최고의 피자

풀이방법 사용된 것: TreeSet 정렬 그리디 2022.11.09 이 문제의 경우, 모든 경우의 수에 대하여 1원당 열량을 구하는 것이 매우 쉽다. 그 이유는 다음과 같다. 토핑의 종류가 최대 100가지밖에 안 된다. 동일한 토핑을 여러 번 올리는 경우가 없다. 토핑의 가격이 모두 같으므로, 열량이 더 높은 토핑을 올리지 않은 채 열량이 더 낮은 토핑을 올린다면 무조건! 손해이다. 그러므로 가장 열량이 높은 토핑부터 골라잡는 게 무조건 이득이다. 따라서 모든 경우의 수에 대한 1원당 열량 값을 싹 다 구하고, 그 중 가장 큰 것을 출력하면 된다. 방법은 다음과 같다. 먼저 토핑의 값을 모두 읽어온 뒤 오름차순 또는 내림차순으로 정렬해놓는다. 아무 토핑도 올리지 않았을 경우의 1원당 열량을 계산하여 그 ..

#3226 : 전화 요금

풀이방법 2022.08.24 테스트케이스 개수가 최대 100개밖에 되지 않아서 그냥 단순하고 무식한 방법으로 해결하였다. 입력값에서 HH와 MM을 얻어오는 데에는 substring을 사용했다. 00시 00분으로부터 몇 분이 지났는지를 시각 값으로 이용함으로써 오전과 오후의 구분을 없애고 요금 계산을 쉽게 하였다. 오전 7시의 시각 값은 7*60 = 420, 오후 7시의 시각 값은 19*60 = 1140이다. 통화 시작 시점의 시각 값을 구해놓고 종료 시점에 이를 때까지 1분씩 더해가면서 요금을 구한다. 현재의 시각 값이 420(7*60) 이상 1140(19*60) 미만이라면 10원을 더하고 그렇지 않다면 5원을 더하는 방식이다. 전화하던 중 날짜가 바뀌었으면 현재의 시각 값을 0으로 만들어주고 계속한다...

#10820 : 문자열 분석

풀이방법 2022.08.24 매우 간단한 문제이다. 주어진 문자열의 모든 글자에 대하여 if문을 사용해 공백, 소문자, 대문자, 숫자의 개수를 세면 된다. EDOC MT 팀대항전에서 푼 문제이다. 코드 Java(2022.08.24) import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException{ // TODO Auto-generated method stub BufferedReader br = new BufferedReader(new InputStreamReader(..