일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 회피
- 일상회피
- 보안취약점
- HelloWorld
- bytecode
- 취약점
- jvm
- 보안
- IMPLEMENT
- 여행계획
- 여행
- static
- ㅇ
- Interface
- Recylcer
- extends
- javap
- 치유
- opcode
- bytecode 분석
- throws
- Android
- Navigation Component
- 심리학
- 일상탈출
- 심리여행
- Transition
- abstract
- Shared Elements
- 버킷리스트
- Today
- Total
패스트터틀
(Baekjoon) GreedyAlgorithm - (7) 대회 or 인턴 본문
https://www.acmicpc.net/problem/2875
다음과 같이 나누어서 생각한다.
본인은 이거 풀다가 코딩실수가 많이 나와서 5번이나 틀렸다. ㅋㅋ
경우의수 1:
ex) 47 23 3
여학생 23팀
남학생 23팀
if(여학생팀 == 남학생팀)
남은학생 : 여학생 % 2;
경우의수 2:
ex) 47 26 3
여학생 23팀
남학생 26팀
if(남학생팀 > 여학생팀)
여학생기준 23개의팀 생성가능
남은학생 : 남학생팀 - 여학생팀 후에 여학생 % 2 를 더하기
경우의수 3:
ex) 63 10 3
여학생 31팀
남학생 10팀
if(여학생팀 > 남학생팀)
남학생기준 10개의팀 생성가능
남은학생 : (여학생팀 - 남학생팀)*2 후에 + 여학생 % 2 를 더하기
--------------------------------------------------------------------------
남은학생이 K랑 같거나 클경우
if(남은학생 >= K))
정답 : 팀
남은학생이 K보다 작을경우
if( 남은학생 < K)
K에서 남은학생을 빼고
K -= 남은학생
K2 = K의 값을 3으로 나누기 + 1 // 계산의 영향을 받지 않게 하기위해 K2를 새로넣었으며
if(K % 3 == 0 ) K2--; // 남은 K의값이 1에서 3이하일경우 1개의팀이 파괴되고하고
정답 : 팀 -= K // 남은 K의값이 4에서 6이하일경우 2개의팀이 파괴되는식으로 따졌을때
// 123 456 789 101112 ..
// 001 112 223 3 3 4 (3으로 나누었을경우)
// 1 2 3 4 ( 001은 1개의팀 112는 2개의팀이 파괴되야하니까)
// 나누기 3을 시행하고 +1을 시행해준후 % 3 == 0 일때는 -1을 한번더 빼준다.
*/
package GreedyAlgorithm;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class _2875 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int NMK[] = new int[]{Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken())};
int Team;
int remain;
if( (NMK[0]/2) == NMK[1]){
Team = NMK[1];
remain = NMK[0] % 2;
}
else if( NMK[1] > (NMK[0]/2) ){
Team = NMK[0]/2;
remain = (NMK[1] - (NMK[0]/2)) + (NMK[0] % 2);
}
else{
Team = NMK[1];
remain = ( (NMK[0]/2) - NMK[1])*2 + (NMK[0] % 2);
}
if (remain >= NMK[2]){
System.out.println(Team);
}
else{
int K = 0;
NMK[2] = NMK[2] - remain;
K = (NMK[2] / 3) + 1;
if( NMK[2] % 3 == 0) K--;
System.out.println(Team - K);
}
}
}
다음은 내가 위와 같이 짠 if문을 while문으로 간단하게 짠코드이다.
나도 저런식으로 생각을했어야 했는데 너무 if문을 많이 써버렸다.
컴퓨터가 반복계산에 능하다는것을 유의하며 반복문을 잘 활용해야한다는걸 배운다.
if문은 반복문중에 있으면 충분하다.
출처 : https://pledge.tistory.com/entry/%EB%B0%B1%EC%A4%802875-%EB%8C%80%ED%9A%8C-or-%EC%9D%B8%ED%84%B4
백준문제풀이Github :
https://github.com/sdk0213/baekjoon-study
'Algorithm > baekjoon' 카테고리의 다른 글
(Baekjoon) GreedyAlgorithm - (9) 잃어버린 괄호 (0) | 2019.11.08 |
---|---|
(Baekjoon) GreedyAlgorithm - (8) 문자열 (0) | 2019.11.08 |
(Baekjoon) GreedyAlgorithm - (6) 30 (0) | 2019.11.07 |
(Baekjoon) GreedyAlgorithm - (5) 로프 (0) | 2019.11.06 |
(Baekjoon) GreedyAlgorithm - (4) 거스름돈 (0) | 2019.11.06 |