728x90
문제
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
일직선 상에서 A 지점과 B 지점을 입력받아 A에서 B까지 도착하려고 할 때, A + 1, A - 2, A + 4, A - 8, A + 16,... 와 같이 지그재그로 방향을 바꾸면서 움직인다.
A지점에서 시작하여 B지점에 처음 도착할 때 이동한 총 거리를 구한다.
코드
첫 번째 줄에 A 지점과 B 지점을 공백(" ")으로 구분하여 입력받는다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
boolean direction = true; // 이동 방향 true 오른쪽, false 왼쪽
int distance = 1; // 이동할 거리
int next = 0; // 다음 지점
int current = a; // 현재 지점
int result = 0; // 총 이동 거리
while (true) {
// 다음 지점 구하기
next = direction ? a + distance : a - distance;
// 오른쪽으로 이동할 때, 현재 지점은 b보다 작고, 다음 지점은 b보다 크거나 같으면
if (direction && current < b && next >= b) {
// 도착 지점에서 현재 지점을 뺀 만큼만 더한다.
result += b - current;
break;
// 왼쪽으로 이동할 때, 현재 지점은 b보다 크고, 다음 지점은 b보다 작거나 같으면
} else if (!direction && current > b && next <= b) {
// 현재 지점에서 도착 지점을 뺀 만큼만 더한다.
result += current - b;
break;
}
// 총 이동 거리 계산
result += next > current ? next - current : current - next;
// 다음 계산을 위한 데이터 변경
current = next;
distance *= 2;
direction = !direction;
}
System.out.println(result);
}
}
- 학생의 이름과 점수를 map에 담아 두 번째로 낮은 점수를 가진 학생의 이름을 출력할 수 있다.
- 만약, map의 길이가 1인 경우 한 학생을 제외한 나머지 학생은 모두 점수가 0이므로 map에 담겨 있는 학생이 최고 점수이자 두 번째로 낮은 점수가 된다.
- 오름차순 정렬된 map의 첫 번째 value는 가장 낮은 점수가 되며, 다음으로 높은 점수를 가진 학생이 두 번째로 낮은 점수를 가진 학생이 된다.
- 만약 다음으로 높은 점수를 가진 학생이 없는 경우, map에 담긴 학생들이 두 번째로 높은 점수를 가졌으며 여려 명이 된다. 따라서 Tie를 출력한다.
728x90