정글 나만무까지 끝나고 이제 취준이 시작되었다.(더 본격적인 정글 시작!) 😱
무엇부터 하면 좋을까 하다가 알고리즘 공부를 다시 시작한다...
마침 구름톤 챌린지라는 좋은 프로그램이 있길래 하나씩 풀이하면서 문법들을 다시 공부해보겠다.
+) 학습일지를 꾸준히 작성하면 네이버 페이를 준다는 사실!
1일차 미션: 운동 중독 플레이어
수식에 따라 결과를 계산한다.
이때 소수점을 잘 처리하는 것이 중요하다. java에서 소수점 계산을 사용하려면 double 형을 사용한다.
나의 풀이
import java.io.*;
import java.util.*;
class Main {
static int w, r;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
StringTokenizer st = new StringTokenizer(input);
w = Integer.parseInt(st.nextToken());
r = Integer.parseInt(st.nextToken());
int rm = (int)(w * (1+r/30d));
System.out.println(rm);
}
}
2일차 미션: 프로젝트 매니징
정수를 시간단위로 변환하는 문제이다.
나는 수학적으로 시간을 분(minute)으로 환산하고, 환산한 시간에서 24시간이 넘어가면 다시 0시로 돌아가도록 처리해주었다.
나의 풀이
import java.io.*;
import java.util.*;
class Main {
static int n, t, m;
static int r_t, r_m;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
t = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
int startTime = t*60 + m;
int howLong = 0;
for(int i = 0; i < n; i++) {
howLong += Integer.parseInt(br.readLine());
}
int totalTime = startTime + howLong;
r_m = (totalTime) % 60;
totalTime /= 60;
while(totalTime >= 24) {
(totalTime) -= 24;
}
System.out.println(totalTime + " " +r_m);
}
}
3일차 미션: 합 계산기
연산자에 따라, 사칙 연산을 정확하게 해주면 된다.
나는 if문을 사용하여 연산자에 따라 연산을 구분하였는데, switch문을 사용해봐도 좋을 것 같다.
switch(입력변수) {
case 입력값1: ...
break;
case 입력값2: ...
break;
...
default: ...
break;
}
나의 풀이
import java.io.*;
class Main {
static int T;
static int result;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
result = 0;
for(int i = 0; i < T; i++) {
String s = br.readLine();
String[] array = s.split(" ");
Integer first = Integer.parseInt(array[0]);
Integer second = Integer.parseInt(array[2]);
String operation = array[1];
if(operation.equals("+")){
result += (first + second);
}
else if(operation.equals("-")) {
result += (first - second);
}
else if(operation.equals("/")) {
result += (first / second);
}
else if(operation.equals("*")) {
result += (first * second);
}
}
System.out.println(result);
}
}
4일차 미션: 완벽한 햄버거 만들기
문제 풀이 단계를 다음과 같이 진행했다.
1. 가장 큰 수를 찾는다.(가장 맛의 정도가 높은 재료 찾기)
2. 가장 큰 수 기준, 왼쪽 배열을 확인한다. -> 왼쪽으로 갈수록 더 작거나 같은 값이 나오는지 확인한다.
3. 가장 큰 수 기준, 오른쪽 배열을 확인한다. -> 오른쪽으로 갈수록 더 작거나 같은 값이 나오는지 확인한다.
=> 본인은 비교를 통해 문제를 풀이하였다.
나의 풀이
import java.io.*;
class Main {
static int N;
static boolean isHamburger;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
String[] s = br.readLine().split(" ");
// 가장 맛의 정도가 높은 재료 찾기
int best = 0;
int best_i = 0;
for(int i = 0; i < N; i++){
if(Integer.parseInt(s[i]) > best) {
best = Integer.parseInt(s[i]);
best_i = i;
}
}
int before_num = best;
int result = best;
// 왼쪽으로 갈수록 더 작거나 같은 값이 나오는지 확인한다.
for(int i = best_i-1; i >= 0; i--) {
if(Integer.parseInt(s[i]) <= before_num) {
before_num = Integer.parseInt(s[i]);
result += Integer.parseInt(s[i]);
}else {
System.out.println(0);
System.exit(0);
}
}
before_num = best;
// 오른쪽으로 갈수록 더 작거나 같은 값이 나오는지 확인한다.
for(int i = best_i+1; i < N; i++) {
if(Integer.parseInt(s[i]) <= before_num) {
before_num = Integer.parseInt(s[i]);
result += Integer.parseInt(s[i]);
}else {
System.out.println(0);
System.exit(0);
}
}
System.out.println(result);
}
}
구름에서 제공한 풀이를 확인해보니 정렬하고 비교하는 방식을 사용했다.
1. 가장 큰 값의 위치를 기준으로 배열을 분리한다.
//최대값과 인댁스 찾기
int maxIndex = arr.indexOf(Collections.max(arr));
// 좌측 리스트와 우측 리스트 생성
ArrayList<Integer> left = new ArrayList<>(arr.subList(0, maxIndex));
ArrayList<Integer> right = new ArrayList<>(arr.subList(maxIndex, n));
2. 좌측은 오름차순으로, 우측은 내림차순으로 정렬한다.
// 좌측 리스트는 오름차순, 우측 리스트는 내림차순으로 정렬
Collections.sort(left);
Collections.sort(right, Collections.reverseOrder());
3. 좌측 리스트와 우측 리스트를 합친다.
ArrayList<Integer> sortedArr = new ArrayList<>();
sortedArr.addAll(left);
sortedArr.addAll(right);
4. 합친 리스트와 입력받은 배열을 비교한다.
같다면 -> 완벽한 햄버거가 되므로 합을 출력한다.
합계는 for문을 사용해도 되지만, stream으로 메서드 모든 요소를 더하는 방법을 사용해도 된다.
// 리스트 비교 후 결과 출력
if (sortedArr.equals(arr)) {
int sum = sortedArr.stream().mapToInt(Integer::intValue).sum();
System.out.println(sum);
} else {
System.out.println(0);
}
이렇게 1주차 챌린지 첫번째 일지를 마무리한다.
이번주차 문제는 기본문법만 알고 있다면 쉽게 풀이할 수 있는 문제라 어렵지 않았다.
알고리즘에 필요한 문법들을 복기할 수 있어서 유익한 시간이었다. 남은 기간동안 문제를 꾸준히 풀어서 하반기 코테에도 좋은 결과가 있음 좋겠다. 홧팅~!