-
[ Algorithm ] 백준/Bronze/10813. 공 바꾸기 (바보비용)Algorithm/문제 풀이 2023. 4. 1. 19:29
하루입니다.
https://www.acmicpc.net/problem/10813
10813번: 공 바꾸기
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 매겨져 있다. 바구니에는 공이 1개씩 들어있고, 처음에는 바구니에 적혀있는 번호와 같은 번호가 적힌 공이
www.acmicpc.net
이 문제는 맨 윗 줄에 바구니의 갯수 n과 변경 횟수인 m을 한번에 준다. 5 8 이런 식으로.
BufferedReader()를 사용하던 나는 StringTokenizer를 두 번 사용하고 싶지 않았기에 다음과 같은 식으로 코드를 짰다.
int n = br.read() - 48; br.read(); int m = br.read() - 48; br.readLine();아니 그러니까 나는. 내가 천재인 줄 알았다. 띄어쓰기까지도 br.read() 한다는 사실을 알고 한 칸 띄어주고 br.readLine()까지 완벽히 처리한 줄 알았으나 ... 말 그대로 한 글자(char) 형식이라는 것을 인지하지 못했다.
위의 식은 5 8 과 같은 경우에는 정상 동작한다. 5개의 바구니가 8번 로케이션 돈다.
하지만 5 13 과 같은 경우에는 정상 동작이 불가하다. 5개의 바구니가 1번 돌게 된다. 3은 br.readLine()에 의해 넘어가게 된다.
더 심각한 경우는 12 13과 같은 경우가 아닐까 싶다. 1개의 바구니가 띄어쓰기 번 로케이션 ... 돌게 되는 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ ...
바본가?
어쨌든 몰랐던 걸 알게 되었다. 여태껏 누구의 코드에서도 br.read()가 보이지 않던 이유가 있었음.
여하튼 위의 코드를 다음과 같이 변경했다.
String[] nm = br.readLine().split(" "); int n = Integer.parseInt(nm[0]); int m = Integer.parseInt(nm[1]);정상 작동한다. 히히 행벅.
비록 바보실수로 인해 약 30분을 날렸지만, 새로운 걸 알게 되고 새로운 방법도 알게 되었으니 가치 있던 시간이라고 생각한다. 왜냐면 br.readLine().split(" ")을 String[] 으로 받아 그 안에서 값을 꺼내는 방법은 아직 사용해 본 적 없기 때문! 하지만 이렇게 된 김에 사용해 봤다!
별개로 메모리(?)랑 시간복잡도(?)만 아니라면 Scanner의 nextInt()를 사용하는 게 이 문제에 더 적합하다는 생각을 했다. 훨씬 코드가 간단하고 가독성도 좋았음.

히히 끝!
코드가 궁금하시다면?
'Algorithm > 문제 풀이' 카테고리의 다른 글
[Algorithm] 백준/Silver/9461. 파도반 수열 (반복문, 재귀함수) (0) 2023.04.03 [Algorithm] 백준/Silver/10773. 제로 (Stack) (2) 2023.04.02 1231. [S/W 문제해결 기본] 9일차 - 중위순회 (0) 2023.03.30 [ Algorithm ] 백준/Bronze/10699. 오늘 날짜 (0) 2023.03.17 [ Algorithm ] 함수형 풀이. Arrays.stream().average().orelse(0) (0) 2023.02.01