기준 막대기높이(standard)보다 비교하는 막대기높이(current)가 크면 갯수를 하나씩 늘려주고 standard를 current로 바꿔준다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
// 막대기
public class Main {
public static void main(String[] args) throws IOException {
Stack<Integer> stack = new Stack<>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int n = Integer.parseInt(str);
int h=0;
for(int i=0; i<n; i++) {
str = br.readLine();
h = Integer.parseInt(str);
stack.push(h);
}
// ==== 입력 끝
int standard = stack.pop();
int cnt = 1;
int current = 0;
while(!stack.isEmpty()) {
current = stack.pop();
if(current > standard) {
standard = current;
cnt++;
}
}
System.out.println(cnt);
}
}
1. R공을 모두 왼쪽으로 이동 문제의 그림1을 볼때 RRRRBBBB로 나열하기 위해서는 첫번째 R을 제외하고는 다 옮겨줘야 한다. 따라서 왼쪽에 R이 계속 있을경우 cnt를 세어준다음 Rcnt-cnt는 이동해야하는 R공의 갯수가 된다. ex) RBBBRBRRR인 경우 첫번째 R이 있으므로 cnt = 1이된다. 따라서 Rcnt(5)-cnt(1)=4가 되고 실제로 왼쪽으로 이동해야하는 R공의 갯수가 된다.
2. R공을 모두 오른쪽으로 이동
3. B공을 모두 왼쪽으로 이동
4. B공을 모두 오른쪽으로 이동
2,3,4번도 뒤에서부터 세야되나 B공을 세야되나에 따라 각각 코드가 조금씩 달라지는거 외에는 같은 원리이다. 자세한 것은 코드를 보면 충분히 이해 가능하다.
코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
// 한국정보올림피아드
// KOI 2019 2차대회 초등부
// 볼 모으기
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String colors = br.readLine();
int result = N;
int rCnt = 0;
int bCnt = 0;
for(int i=0; i<N; i++) {
if(colors.charAt(i)=='R')
rCnt ++;
else
bCnt ++;
}
int cnt = 0;
// 4가지 경우
// 1. R만 움직여서 RRRBBB(R을 다 왼쪽으로)
for(int i=0; i<N; i++) {
if(colors.charAt(i)=='R')
cnt++;
else
break;
}
result = Math.min(result, rCnt-cnt);
// 2. R만 움직여서 BBBRRR
cnt = 0;
for(int i=N-1; i>=0; i--) {
if(colors.charAt(i)=='R')
cnt++;
else
break;
}
result = Math.min(result, rCnt-cnt);
// 3. B만 움직여서 BBBRRR
cnt = 0;
for(int i=0; i<N; i++) {
if(colors.charAt(i)=='B')
cnt++;
else
break;
}
result = Math.min(result, bCnt-cnt);
// 4. B만 움직여서RRRBBB
cnt = 0;
for(int i=N-1; i>=0; i--) {
if(colors.charAt(i)=='B')
cnt++;
else
break;
}
result = Math.min(result, bCnt-cnt);
System.out.println(result);
}
}
1. 일단 문제의 조건4에서 2,5,8,0 숫자 키패드가 나온경우 두 엄지손가락의 현재 키패드 위치에서 더 가까운 엄지 손가락을 사용한다고 하였으므로 왼손, 오른손 엄지의 위치를 저장할 변수를 선언해주었다.(lLoc, rLoc) (이때, lLoc(왼손 엄지 위치)의 초깃값은 * 키패드의 위치인 {3,0}으로 rLoc(왼손 엄지 위치)의 초깃값은 # 키패드의 위치인 {3,2}로 설정해주었다.)
2. 각 숫자 패드의 위치를 ArrayList<int[]> locList에 저장해주었다. (locList.get(i) 하면 i 키패드의 위치가 나올 수 있게)
3. 조건2, 조건3과 같이 147, 369가 나온경우 각각 왼손 위치, 오른손 위치를 저장해주고 answer에는 L, R을 추가해준다.
4. 조건 4같이 2580이 나온경우 왼, 오른손과의 거리를 구해주고 더 가까운 손을 answer에 추가해준다. 이때 같으면 hand에 영향을 받도록 구현하였다.
(자세한 것은 코드의 주석 참고!)
코드
import java.util.*;
// 키패드 누르기
class Solution {
// 00~02
// ..
// 30~32
static int[] lLoc = {3, 0}; // 왼 엄 위치(*)
static int[] rLoc = {3, 2}; // 오 엄 위치(#)
static List<int[]> locList = new ArrayList<>();
public String solution(int[] numbers, String hand) {
String answer = "";
int x = 0;
int y = 0;
// 0~9 키패드 위치 저장
for(int i=0; i<=9; i++){
if(i==0)
locList.add(new int[]{3,1});
else{
locList.add(new int[]{x, y});
y++;
if(y % 3 == 0){
y = 0;
x++;
}
}
}
// 가운데 패드와 왼, 오른 엄지손가락 거리
int lDistance = 0;
int rDistance = 0;
StringBuilder sb = new StringBuilder();
for(int i=0; i<numbers.length; i++){
// 147
if(numbers[i] == 1 || numbers[i] == 4 || numbers[i] == 7){
sb.append("L");
lLoc = locList.get(numbers[i]);
}
// 369
else if(numbers[i] == 3 || numbers[i] == 6 || numbers[i] == 9){
sb.append("R");
rLoc = locList.get(numbers[i]);
}
// 2580
else{
// 거리 계산
lDistance = Math.abs(lLoc[0]-locList.get(numbers[i])[0]) + Math.abs(lLoc[1]-locList.get(numbers[i])[1]);
rDistance = Math.abs(rLoc[0]-locList.get(numbers[i])[0]) + Math.abs(rLoc[1]-locList.get(numbers[i])[1]);
// 거리가 같으면 손잡이 따라감
if(lDistance == rDistance){
if(hand.equals("right")){
sb.append("R");
rLoc = locList.get(numbers[i]);
}
else if(hand.equals("left")){
sb.append("L");
lLoc = locList.get(numbers[i]);
}
}
// 왼쪽
else if(lDistance < rDistance){
sb.append("L");
lLoc = locList.get(numbers[i]);
}
// 오른쪽
else if(rDistance < lDistance){
sb.append("R");
rLoc = locList.get(numbers[i]);
}
}
}
answer = new String(sb);
return answer;
}
}