개발 As 공부 15

BufferedReader VS Scanner 속도 차이

상황 요약백준 4949번 문제를 풀고 난 후 다른 사용자들의 답변 확인 중에 내가 제출한 코드의 실행 시간이 유난히 돋보임. 같은 언어 (JAVA)를 사용했음에도 불구하고 내 답변의 실행 시간은 다른 사용자들의 두 배. 이미 몇 가지 코드를 보며 대부분 stack을 활용해 문제를 풀어낸 것을 알고 있음. 나와 풀이 방식이 별로 다르지는 않다. 그렇다면 차이가 무엇인가? 입/출력 방식이 눈에 띔. 나는 Scanner를 사용하여 입력 받고 있었고 다른 사용자들은 Buffer를 통한 입력을 받고 있었다. 짐작가는 원인을 찾아냈으면 테스트를 통한 결과를 보고 말아야만 직성이 풀리지 않는가. 그래서 아래와 같이 Scanner -> BufferedReader로 바꿔 답변을 제출해 봄. 실행 시간이 다른 사용자들과 ..

JAVA의 자료구조 (JAVA Collection Framework)

자료구조와 Collection Framework? 자료구조란 Data의 집합을 의미하며 컴퓨터가 데이터를 효율적으로 처리하기 위해 만든 구조이다. Collection Framework는 이러한 자료구조를 표준화된 방법으로 제공 가능하게 하는 클래스의 집합이다. Collection Framework는 대표적으로 List, Set, Map이 있으며 아래와 같은 구조를 가지고 있다. List, Set, Map은 기본형(primitive) 데이터의 저장이 불가능하고 참조형(reference) 데이터만 저장 가능하다. 만약 기본형 데이터를 저장하고 싶다? 그럼 Wrapper클래스를 사용하면 된다. 예) int 대신 Integer클래스, boolean 대신 Boolean 클래스 사용. 해당 글에서는 Collecti..

[백준] 8595번: 히든 넘버 - JAVA

문제 보기 문제 분석 [요약] 문자열 하나가 주어진다. 주어진 문자열 사이 사이에 존재하는 숫자를 찾아 모두 더하여 출력한다. [푸는 과정] 오랜만에 한 시간 넘게 잡고 있던 알고리즘 문제다. 왜냐하면... 지금부터 썰을 풀어볼 것이다. //문제를 대충 읽었어요.. 처음에는 그냥 모든 숫자를 일의자리 숫자 취급하여 더해버렸다(문제를 제대로 읽자..ㅎ). 당연히 오답. 자세히 살펴보니 붙어있는 숫자는 하나의 숫자 취급을 해 주어야 한다. 예를 들어 'a555d222f6d5s1'이라는 문자열에 숨어있는 숫자는 '555', '222', 6', '5', '1' 이 되고 555+222+6+5+1 = 789가 정답이 된다. //로직이 틀렸어요.. 이제 문제를 제대로 파악했으니 코드를 짜 본다. 또 오답이다. 이건 ..

[백준] 9536번: 여우는 어떻게 울지? - JAVA

문제 보기 문제 분석 [요약] 주어진 케이스 별로 1)첫 번째 줄 : 녹음기에 담긴 모든 울음소리, 2)두 번째 줄~'What does the fox say'이전 까지의 줄 : 각 동물의 울음소리 이다. 1번 문장을 2번에서 언급한 동물의 울음소리를 제외하여 출력한다. [푸는 과정] 각 동물의 울음소리를 " goes "로 잘라내서 HashTable에 담고 차례대로 'replace()'를 써서 해당 울음소리를 모두 ''로 바꾼 뒤 출력하는 방법이 바로 떠올랐다. 그런데 여기서 문제 발생. 예제의 'seal'은 'ow'소리를 내며 울고 모든 동물 울음소리를 담은 문장에 'pow'가 포함되어 있다. 그래서 만약 'replace("ow", "");'를 쓴다면 'pow'라는 단어가 'p'로 변해버린다. 그래서 다..

[백준] 11497번: 통나무 건너뛰기 - JAVA

문제 보기 문제 분석 [요약] 다양한 높이의 통나무를 원형으로 세웠을 때 높이 차이가 가장 적도록 배치하기. [푸는 과정] 우선 숫자의 최소 혹은 최대를 구하는 문제기 때문에 '정렬'이 필요 하겠다. 정렬이 쉽도록 배열을 선택할 것이다. 각 숫자의 차이가 가장 적도록 배치하려면 우선 가장 큰수를 중간에 배치 하고 남은 숫자들을 양 옆으로 내림차순 배치를 하면 되겠다. input용 배열 하나(=numbers), 통나무 정렬용 배열(=logs) 하나로 총 두 개의 배열을 사용 할 것이다. 이제 나란히 놓인 두 숫자의 차 중 가장 큰 차를 구해야 한다. 혹시 모를 시간초과 방지를 위해 통나무를 정렬하면서 Math.max()함수를 이용해 두 수의 최대 차를 구할 것이다. 코드 보기 import java.io.*..

[JAVA] ConcurrentModificationException 해결 썰

프로그래머스의 '주차 요금 계산'문제를 풀고 코드 제출을 했다. 16개의 테스트 케이스 중 대부분의 케이스가 '런타임에러'를 띄웠다. 처음에는 얼핏 빨간색만 보고 로직 문제로 인한 일반적인 실패인 줄 알았다. 근데 자세히 보니 런타임 에러? 정확히 어떤 에러인지 알려주지는 않는 것 같았다. 그냥 다른 로직을 짜야 하나 고민 하던 중 어쨌든 지금 내가 제출한 코드가 제대로 된 코드인지 확인하고 싶었다. 그러려면 일단 런타임 에러를 해결해야 했다. 코드의 로직은 크게 세 부분으로 나뉜다(메인 함수에 로직이 세 개). 우선 확인 범위를 줄이기 위해 어떤 로직에서 에러가 나는지 확인 해 볼 것이다. 첫 번째 로직을 주석 처리 해 보았다. 런타임 에러가 떴다. 그럼 첫 번째 로직에서 런타임 에러가 나고 있을 확률..

[JAVA] 시간 차이 계산하기

코드를 짜다가 시간 차이를 계산해야 할 일이 생겼다. 직접 분, 초 등의 단위로 변환하여 계산 해 주어도 되지만 하단의 방법을 사용하면 휴먼에러를 피할 수 있다. public static void main(String[] args) throws ParseException { SimpleDateFormat formatter = new SimpleDateFormat("HH:mm", Locale.KOREA); Date date1 = formatter.parse("15:00"); Date date2 = formatter.parse("09:39"); // 시간 차이 계산 // getTime() : Date를 milliseconds로 반환 long difference = date1.getTime() - date2...

[프로그래머스] 주차 요금 계산 - JAVA

문제 보기 문제 분석 [요약] 주차장을 이용한 차량별 요금을 계산 하여 차량 번호 오름차순으로 출력하기. 테스트 케이스별로 기본 시간/요금, 단위 시간/요금이 다름. [푸는 과정] 차량번호를 기준으로 이용시간 체크를 해야겠다. 총 이용시간을 계산 하려면 여러번의 차량번호 검색이 필요하기 때문에 시간초과 방지를 위해 Map을 써야겠다. 주차장 이용 중인 차량 용 Map(=carParkRecords), 각 차량 별 총 이용 시간용 Map(=useTimeRecords) 이렇게 두 가지 맵을 사용할 것이다. 해당 문제에서 각 차량 별 출입 시간을 오름차순으로 제공한다. 그렇기에 carParkRecords에 해당 차량이 있으면, 해당 입력이 해당 차량의 출차 시간을 나타내므로 시간 차이를 계산하여 useTimeR..

[알고리즘] 동적 프로그래밍, DP(Dynamic Programming)

(나만의)구분 특징 문제가 반복적인 작은문제로 이루어짐 점화식 도출 필요 피보나치 함수 알고리즘 작성순서 점화식 도출(반복적 부분을 식으로 표현) Top-down VS Bottom-up 선택 비 반복 부분 존재 시 따로 추가 구현(즉, 비 반복적 부분 + 점화식의 형태) 참고 Bottom-Up / Top-Down 비교 Bottom-Up : 필요한 재료 전부를 미리 준비 후 바구니에 넣고 꺼내어 쓰는 방식 ☞ (바구니=)배열/리스트 등 Top-Down : 필요한 재료를 그때그때 준비해나가는 방식 ☞ 재귀함수 사용 피보나치 수열을 통해 이해하기 '동적 프로그래밍'이라는 이름이 그리 직관적은 아니라 생각한다. 따라서 해당 알고리즘을 이제 막 접하기 시작했다면 단번에 이해하기 힘들수 있다(사실은 내가 그러했다)..