알고리즘 문제 풀이

SWEA 1225 암호 생성기

superbono 2021. 2. 4. 17:16

문제 출처: swexpertacademy.com/main/talk/solvingClub/problemView.do?solveclubId=AXdg1Idq4GwDFAS5&contestProbId=AV14uWl6AF0CFAYD&probBoxId=AXdg1Idq4G0DFAS5+&type=PROBLEM&problemBoxTitle=2%EC%9B%941%EC%A3%BC%EC%B0%A8&problemBoxCnt=++10+

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

 

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class 큐 {
	static Queue <Integer> q;
	static int N, front, rear;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		for (int tc = 1; tc <= 10; tc++) {
			N = sc.nextInt();
			q = new LinkedList <Integer>();
			
			for (int i = 0; i < 8; i++) {
				int tmp = sc.nextInt();
				q.offer(tmp);
				if(i == 7) {
					rear = tmp; //제일 끝 인덱스 값 넣어주기
				}
			}
		
			while(rear > 0) {
				// 싸이클 돌리기
				for (int i = 1; i <= 5; i++) {
					front = q.poll();
					rear =front - i;
					if(rear <= 0) {rear = 0; 
					q.offer(rear);
					break;
					}
					q.offer(rear);
					
				}
			}
			
			System.out.print("#" + tc + " ");
			while(!q.isEmpty()) {
				System.out.print(q.poll() + " ");
			}
			System.out.println();
		}
	}
}
// 뭔가 티스토리가 코드 붙여넣으면 글이 작성이 잘 안될 떄가 있어서 부가 설명은 여기다가 적겠다.
// 푸는 방법이야 여러가지 있겠지만 나는 제일 끝에 들어가는 마지막(rear) 변수를 들고 있으면서
// 그 변수의 값이 0보다 작거나 같은지를 검사해주도록 짰다.

   새로운 접근법 ============================

공통의 배수를 미리 뺀다는 아이디어

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class ImprovedQueueVer {
	static Queue <Integer> q;
	static int N, front, rear, Min, tmp;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		for (int tc = 1; tc <= 10; tc++) {
			q = new LinkedList <Integer>();
			N = sc.nextInt();
			// 수의 범위가 인티저를 넘지 않는다고 했으므로 max value 넣어줌
			Min = Integer.MAX_VALUE;
			
			for (int i = 0; i < 8; i++) {
				tmp =  sc.nextInt();
				// 입력 값중에 최소값을 찾자
				q.offer(tmp);
				if(tmp < Min) {
					Min = tmp;
				}
			}
			// 수가 돌다가 자기 자리로 갈 때 빠지는 수(값)는 15임
			// 최솟값을 15로 나눠 공통의 배수를 뽑는다 -> 이 부분 이해 잘해야함
			// 그니까 9550을 15로 나눈 몫은 636이자나 근데 다른 수들한테 636 빼는건 의미가 없지
			// 636 * 15를 해줘야 9540이라는 변수가 나오는거니까
			// 그렇게 해서 10 16 10 13 18 11 11 11 이라는 값을 얻는다
			// 이거는 일단 제자리로 돌아오는 연산을 636번 한 경우 그걸 일일히 하나하나 돌리지 않고 미리 빼준거임
			// 그래서 일단 이 val 변수는 수가 한바퀴 (1~5사이클이 아니라 돌다가 자기 원래 자리로 가는 거)
			// 를 돌 때 도는 바퀴수를 저장해주는 것 그래서 일일히 돌 필요 없이 공평하게 자 몇바퀴 돌았다고 생각하자 이러고 미리 그 돈 횟수만큼 빼주면 되니까
			// 그런데 만약에 15로 나누어 떨어지는 수라면 나머지가 0 이 되니까 큐의 마지막 원소가 0이 된다면 종료한다는 문제 조건에 어긋난다
			// 그래서 그런 경우에는 15를 더해주어야 한다. (몫에서는 하나를 빼줘야겟지)
			int val = 0;
			if(Min % 15 == 0) {
				val = Min / 15 * 15 - 15;
			}
			else {
				val = Min / 15 * 15;
			}
			// 공통의 배수 다 빼주자
			for (int i = 0; i < 8; i++) {
				tmp = q.poll() - val;
				q.offer(tmp);
				if(i == 7) {
					rear = tmp;
				}
			}
			
			while(rear > 0) {
				// 싸이클 돌리기
				for (int i = 1; i <= 5; i++) {
					front = q.poll();
					rear =front - i;
					if(rear <= 0) {rear = 0; 
					q.offer(rear);
					break;
					}
					q.offer(rear);
					
				}
			}
			System.out.print("#" + tc + " ");
			while(!q.isEmpty()) {
				System.out.print(q.poll() + " ");
			}
			System.out.println();
			
		}
	}
}

'알고리즘 문제 풀이' 카테고리의 다른 글

백준 1065 한수 (Java 자바)  (0) 2021.02.08
SWEA 퍼펙트 셔플  (0) 2021.02.05
백준2164 카드2  (0) 2021.02.04
SWEA 괄호 짝짓기  (0) 2021.02.04
SWEA) 중간값 찾기  (0) 2021.02.03