본문 바로가기
알고리즘/문제 풀이

[☁️ 구름톤 챌린지] 1주차 학습일지 - 1

by 위대한초밥V 2023. 8. 18.

정글 나만무까지 끝나고 이제 취준이 시작되었다.(더 본격적인 정글 시작!) 😱

무엇부터 하면 좋을까 하다가 알고리즘 공부를 다시 시작한다...

 

마침 구름톤 챌린지라는 좋은 프로그램이 있길래 하나씩 풀이하면서 문법들을 다시 공부해보겠다. 

+) 학습일지를 꾸준히 작성하면 네이버 페이를 준다는 사실!

 

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주차 챌린지 첫번째 일지를 마무리한다.

이번주차 문제는 기본문법만 알고 있다면 쉽게 풀이할 수 있는 문제라 어렵지 않았다. 

알고리즘에 필요한 문법들을 복기할 수 있어서 유익한 시간이었다. 남은 기간동안 문제를 꾸준히 풀어서 하반기 코테에도 좋은 결과가 있음 좋겠다. 홧팅~!

반응형