[P&B] #10 PreCodingTest
프리코딩테스트 1-1
2) Take The Sand
오답 노트 코드
import java.util.*;
public class PrePractice01_02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("num = ");
int weight = sc.nextInt();
boolean result = false;
if(weight>0 && weight<=100000){
result = solution(weight);
System.out.println(result);
}
}
public static boolean solution(int num) {
boolean answer = true;
answer = num % 4 != 1;
return answer;
}
}
문제 풀이 코멘트
문제에서 깃발은 1kg 미만이 되면 쓰러지므로, 본인이 승리하려면 마지막에 깃발이 1kg 미만이 되도록 게임을 진행해야한다. 즉, 문제를 푸는 핵심은 1, 2, 3kg을 번갈아 가며 가져가면서, 가장 마지막에 1kg를 상대방에게 남기면 승리할 수 있다는 것이다. 최대로 가져갈 수 있는 양이 3이므로 입력받은 num을 4로 나누었을 때 나머지가 1이면, 본인이 첫 번째 차례에 가져가는 것에 따라 마지막에 1kg가 남기 때문에 패배하게 된다. 그 외의 경우에는 반드시 승리하게 되는 방법이 있으므로 answer는 true가 된다. 문제의 핵심을 잘 간파하여 알고리즘을 잘 짜는것이 관건일 것 같다.
4) Most Appear Number
오답 노트 코드
import java.util.*;
public class PrePractice01_04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("s =");
String number = sc.nextLine();
int result = 0;
String[] s = number.split(" ");
if(s.length > 0 && s.length <= 100){
result = solution(number);
}
System.out.println(result);
}
public static int solution(String s) {
int answer = 0;
int max = Integer.MIN_VALUE;
Map<Integer, Integer> map = new HashMap<>();
String[] arr = s.split("");
for (String str : arr) {
int num = Integer.parseInt(str);
map.put(num, map.getOrDefault(num, 0) + 1);
}
for (int i : map.keySet()) {
if (max < map.get(Integer.valueOf(i))) {
max = map.get(Integer.valueOf(i));
answer = i;
}
}
return answer;
}
}
문제 풀이 코멘트
문자열에서 가장 많이 등장하는 숫자를 찾되 동일하게 등장하는 숫자가 여러개라면 그 중 작은 숫자를 반환해야한다. 먼저 가장 많이 등장한 숫자의 등장 횟수를 저장하는 변수인 max를 Integer.MIN_VALUE로 초기화한다. Integer.MIN_VALUE로 초기화하는 이유는 map의 값들과 비교하기 위해 충분히 작은 초기값으로 설정한 것이다. 입력받은 문자열을 split으로 나누어 문자형 배열에 for문으로 하나씩 넣어 이를 숫자로 변환해 맵으로 감싼다. 맵의 value 값은 처음 등장했다면 0, 그 이후엔 1씩 증가하도록 넣기 위해 map.getOrDefault(num, 0) + 1 이라는 함수를 사용한다. 두번째 for문에서 i는 키값, 즉 숫자인데 map.get(Integer.valueOf(i))로 등장횟수를 구해 max와 비교한다. 동일하지만 더 적은 수를 반환되는 것은 동일한경우에는 max와 answer값이 갱신되지 않도록, 오직 등장횟수가 큰 경우에만 갱신되도록 했기 때문에 작은 수가 반환된다.