[프로그래머스 고득점Kit] 0805 - 그리디

HyeJi9908·2022년 8월 5일
0

[JAVA] 프로그래머스

목록 보기
8/11

📚 체육복 - lv1

public class Greedy0805_1 {
	public int solution(int n, int[] lost, int[] reserve) {
		int answer =n;
		int[] arr = new int[n];
		
		for(int l:lost) arr[l-1]--;
		for(int r:reserve) arr[r-1]++;
		
		for(int i=0;i<arr.length;i++) {
			if(arr[i]==-1) { 	// 본인이 체육복이 없을 때
				if(i-1>0&&arr[i-1]==1) {
					arr[i-1]--;
					arr[i]++;
				}
				else if(i+1<arr.length&&arr[i+1]==1) {
					arr[i+1]--;
					arr[i]++;
				}
				else answer--;
			}
		}
		return answer;
	}
}

📚 조이스틱

	public int solution(String name) {
		
		int answer=0;
		int min_move = name.length()-1;
		
		for(int i=0;i<name.length();i++) {
			
			// up과 down을 했을 때 더 작은 횟수
			answer+=Math.min(name.charAt(i)-'A','Z'+1-name.charAt(i));
			
			int next = i+1;	// 마지막 A다음 문자의 인덱스
			while(next<name.length()&&name.charAt(next)=='A')
				next++;
			// 'JAAZ'면 i=0일 때 next=3까지 채우고 반복문 탈출	
			
			min_move = Math.min(min_move, i+i+name.length()-next);
			// 블로그 참고. 정방향으로 갔을 때 vs 반대방향으로 갔을 때
			
			// BBBBAAAAAAB 같이, 연속된 A의 앞쪽보다 뒷쪽이 짧은 경우
			// 뒷쪽부터 조작하는 것이 더 적은 이동횟수를 가질 경우까지 고려해서
			min_move = Math.min(min_move,(name.length()-next)*2+i);
		}
		
		answer+=min_move;
		
		return answer;
	}

0개의 댓글