본문 바로가기
Swexpert

[swexpert] Intermediate / Queue / 1225 / 1226 / 1227

by 29살아저씨 2021. 8. 12.
반응형

🅰 1225. 암호생성기

✏️ 문제 풀이

8개의 숫자를 입력 받는다.

첫 번째 숫자를 1 감소한 뒤, 맨 뒤로 보낸다. 다음 첫 번째 수는 2 감소한 뒤 맨 뒤로, 그 다음 첫 번째 수는 3을 감소하고

맨 뒤로, 그 다음 수는 4, 그 다음 수는 5를 감소한다. 이와 같은 작업을 한 사이클이라 한다.

숫자가 감소할 때 0보다 작아지는 경우 0으로 유지되며, 프로그램은 종료된다. 이 때의 8자리의 숫자 값이 암호가 된다.

큐를 이용하여 8개의 숫자를 입력받은 뒤 while문을 통해 반복을 해주었고

그 안에 for문을 넣어 감소한 숫자를 반복해주었다.

q.poll()-i 가 0보다 작거나 같으면 암호문이 종료되는 조건이므로

큐에 삽입 후 while문을 빠져나오도록 설정해주었다.

✏️ 소스코드

package queue;

import java.util.*;

public class Solution_D3_Sw1225_손은성 {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		Queue<Integer> q = new LinkedList<>();
//		test_case 10번 반복
		for (int test_case = 1; test_case <= 10; test_case++) {
			
			int T = sc.nextInt();
			
			
//			8개의 데이터 queue에 입력
			for (int i = 0; i < 8; i++) {
				int input = sc.nextInt();
				q.offer(input);
			}

//			연산 수행
			Loop1: while (true) {
				for (int i = 1; i <= 5; i++) {
					int n = q.poll() - i;
					if (n <= 0) {
						q.offer(0);
						break Loop1;
					} else {
						q.offer(n);
					}
				}
				
//			결과 출력
			}System.out.printf("#%d ", test_case);
			while (!q.isEmpty()) {
				System.out.print(q.poll() + " ");
			}
			System.out.println();
		}
	}
}

✅ 후기

배열을 이용하면 복잡했겠지만, 큐를 이용해서 풀면 쉽게 풀리는 문제


🅰 1226. 미로 1

✏️ 문제 풀이

- 아래 그림과 같은 미로가 있다. 16*16 행렬의 형태로 만들어진 미로에서 흰색 바탕은 길, 노란색 바탕은 벽을 나타낸다.

가장 좌상단에 있는 칸을 (0, 0)의 기준으로 하여, 가로방향을 x 방향, 세로방향을 y 방향이라고 할 때, 미로의 시작점은 (1, 1) 이고 도착점은 (13, 13)이다.

- 주어진 미로의 출발점으로부터 도착지점까지 갈 수 있는 길이 있는지 판단하는 프로그램을 작성하라.

- direction 배열을 선언하여 위,아래,좌,우 방향에 길이 있는지 파악하도록 하였다.

- 미로 배열을 저장하며 시작점의 x좌표와 y좌표를 큐에 넣어주었다.

-반복문을 사용하여 큐가 비어있을때까지 돌도록 while문 조건을 걸어주었고, 큐에서 x,y좌표를 꺼내

시작점을 기준으로 위, 아래,좌,우 탐방을 한 뒤 길이 있으면 그 길의 x,y좌표를 큐에 저장하였다.

- 왔던 길은 다시 돌아가지 않도록 1로 초기화 시켜주었다.

- while문이 다 도는동안 도착점인 3을 만나게 되면 길이 존재함을 알고 종료하였고,

다 도는동안 도착점을 못만나면 미로는 길이 없음으로 출력하였다.

✏️ 소스코드

package queue;

import java.io.*;
import java.util.*;

public class Solution_D4_Sw1226_손은성 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		for (int test_case = 1; test_case <= 10; test_case++) {
			int T = Integer.parseInt(br.readLine());
			Queue<Integer> q = new LinkedList<>();
			int maze[][] = new int[16][16];
			int col[] = { -1, 1, 0, 0 };
			int row[] = { 0, 0, -1, 1 };
			int result = 0;
//			사다리 데이터 입력
			for (int i = 0, end = maze.length; i < end; i++) {
				String str = br.readLine();
				for (int j = 0, end2 = maze.length; j < end2; j++) {
					maze[i][j] = str.charAt(j) - '0';
					if (maze[i][j] == 2) {
						q.offer(i);
						q.offer(j);
					}
				}
			}

			Loop1: while (!q.isEmpty()) {
				int r = q.poll();
				int c = q.poll();
				for (int i = 0; i < 4; i++) {
					int nr = r + col[i];
					int nc = c + row[i];
					if (maze[nr][nc] == 0) {
						q.offer(nr);
						q.offer(nc);
						maze[nr][nc] = 1;
					}
					if (maze[nr][nc] == 3) {
						result = 1;
						break Loop1;
					}
				}
			}
			System.out.printf("\n#%d %d", T, result);
		}
	}
}

}

✅ 후기

열심히 브레인스토밍 하다 도저히 어려워서 구글을 참고하였다,, 어떤 식으로 접근해야하는지에 대해 깨달았고, 다음에는 구글을 참고하지 않을 것이다.


🅰 1227. 미로 2

✏️ 문제 풀이

미로 1번과 마찬가지로 풀었고 배열의 크기만 100*100으로 변경해주었다.

✏️ 소스코드

package queue;

import java.io.*;
import java.util.*;

public class Solution_D4_Sw1227_손은성 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		for (int test_case = 1; test_case <= 10; test_case++) {
			int T = Integer.parseInt(br.readLine());
			Queue<Integer> q = new LinkedList<>();
			int maze[][] = new int[100][100];
			int row[] = { -1, 1, 0, 0 };
			int col[] = { 0, 0, -1, 1 };
			int result = 0;
//			사다리 데이터 입력
			for (int i = 0, end = maze.length; i < end; i++) {
				String str = br.readLine();
				for (int j = 0, end2 = maze.length; j < end2; j++) {
					maze[i][j] = str.charAt(j) - '0';
					if (maze[i][j] == 2) {
						q.offer(i);
						q.offer(j);
					}
				}
			}

			Loop1: while (!q.isEmpty()) {
				int r = q.poll();
				int c = q.poll();
				for (int i = 0; i < 4; i++) {
					int nr = r + col[i];
					int nc = c + row[i];
					if (maze[nr][nc] == 0) {
						q.offer(nr);
						q.offer(nc);
						maze[nr][nc] = 1;
					}
					if (maze[nr][nc] == 3) {
						result = 1;
						break Loop1;
					}
				}
			}
			System.out.printf("\n#%d %d", T, result);
		}
	}
}

✅ 후기

 

반응형

댓글