🎈섹션1. 시뮬레이션 & 구현
시뮬레이션 & 구현 알고리즘
- 어떤 개체가 이동하는 것을 코드 상으로 구현한 것
- (상/하/좌/우) 이동
- 문제를 해석하고 해석한 내용을 코드로 구현하는 게 중요하다.
🟦 1-1. 사다리 타기
문제
현수네 반에는 n명의 학생이 있습니다. 선생님은 n명의 학생이 모두 사다리타기를 한 다음 당첨
된 학생을 이 번주 학급회장으로 선출하려고 합니다.
각 학생은 알파벳 대문자로 표시됩니다.
만약 n=5 이고 아래와 같은 사다리라면 위에 사다리는 세로 라인이 1부터 5까지로 표현는 5개의 세로줄과 3개의 가로줄을 가지고 있습니다.
첫 번째 가로줄은 1번 세로줄과 2번 세로줄을 연결한 가로막대와 3번 세로줄과 4번 세로줄을 연결한 가로막대 2개가 있는데 이를 표현하는 방법은 [1, 3]으로 표현합니다.
즉 가로막대가 연결하고 있는 세로줄 중 왼쪽 세로줄 번호만 알려주는 형식입니다.
예를 들어 어떤 가로줄의 입력정보가 [1, 3, 5]로 표현된다면 이 가로줄에는 1번 세로줄과 2번 세로줄은 연결한 가로막대, 3번 세로줄과 4번 세로줄은 연결한 가로막대, 5번 세로줄과 6번 세로줄은 연결한 가로막대 이렇게 3개의 가로막대가 존재한다는 것입니다.
아래 그림처럼 가로줄의 정보는 [1, 2]와 같이 두 가로막대가 직접연결되는 경우는 입력되지 않
습니다. 위에 사다리의 정보는 [[1, 3], [2, 4], [1, 4]]와 같이 첫 번째 가로줄부터 순서대로 입력정보가
2차원 배열로 주어집니다. 사다리를 타는 학생은 알파벳순으로 1번 세로줄부터 순서대로 사다리를 탑니다.
매개변수 n에 학생수, ladder에 사다리의 정보가 주어지면, 모든 학생이 사다리를 탄 결과를 담
은 배열을 반환하는 프로그램을 작성하세요.
문제 풀이
- 가로줄을 만났을 때 위치 교환이 되는 매커니즘을 이해해야 한다.
코드
/* 1-1. 사다리 타기 | 자리교환
* */
import java.util.*;
class Solution1 {
public char[] solution(int n, int[][] ladder){
char[] answer = new char[n];
//우선 기본 answer는 대문자 A ~ 차례로 세팅 초기화
for(int i=0; i<n; i++) {
answer[i] = (char)(i+65);
}
//실질적인 자리 교환 로직
//1) 사다리 각 가로줄 뽑아옴
for(int[] line : ladder) {
//2) 뽑아온 가로줄 차례로 탐색
for(int x: line) {
char tmp = answer[x];
answer[x] = answer[x-1];
answer[x-1] = tmp;
}
}
return answer;
}
//실행 메인
public static void main(String[] args){
Solution1 T = new Solution1();
System.out.println(Arrays.toString(T.solution(5, new int[][]{{1, 3}, {2, 4}, {1, 4}})));
System.out.println(Arrays.toString(T.solution(7, new int[][]{{1, 3, 5}, {1, 3, 6}, {2, 4}})));
System.out.println(Arrays.toString(T.solution(8, new int[][]{{1, 5}, {2, 4, 7}, {1, 5, 7}, {2, 5, 7}})));
System.out.println(Arrays.toString(T.solution(12, new int[][]{{1, 5, 8, 10}, {2, 4, 7}, {1, 5, 7, 9, 11}, {2, 5, 7, 10}, {3, 6, 8, 11}})));
}
}
🟦 1-2. 청소 | 상하좌우 이동
문제
청소 로봇이 방을 청소하려고 합니다. 방은 n*n 격자판 지도로 표현됩니다. 방에는 장애물(1로 표시)이 있고, 장애물이 있는 지점은 로봇이 지나갈 수 없습니다.
로봇은 지도의 왼쪽 가장 위 격자에서 3시 방향(오른쪽)을 보고 있습니다.
로봇이 한 격자를 이동하는데 걸리는 시간은 1초입니다.
로봇은 매초 한 칸씩 보고 있는 방향으로 이동합니다.
만약 지도 끝으로 이동해 더 이상 전진 할 수 없거나 또는 장애물을 만나면 제자리에서 시계방향으로 90도 회전합니다.
회전하는데도 1초의 시간이 필요합니다.
매개변수 board에 방의 지도정보가 주어지고, k에 초시간이 주어지면 로봇이 움직이기 시작해서 k초 후에 멈춥니다. k초 후 로봇의 위치를 반환하는 프로그램을 작성하세요.
문제풀이
- 상하좌우 이동을 위한 변수 선언이 중요하다.
코드
/* 1-2. 청소 | 로봇이 상하좌우 위치로 이동함
* */
import java.util.*;
class Solution2 {
//솔루션 함수
public int[] solution(int[][] board, int k){
int[] answer = new int[2]; //반환용 답
int n = board.length; //격자판 크기
//위치 이동 변수 : 12. 3. 6. 9 시계방향 순
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
int d = 1, x= 0, y=0, count=0;
while(count < k) {
count++;//반복 조건
int nx = x + dx[d];
int ny = y + dy[d];
// 격자밖 or 장애물 만날 경우 = 회전 해야 함
if(nx <0 || nx >= n || ny <0 || ny >=n || board[nx][ny] == 1) {
d = (d+1) % 4;//계속 시계방향으로 회전 처리해야 하고
//회전 시에도 시간 걸리므로 위치 동일해야 함
continue;
}
//좌표 찍어주고
x = nx;
y = ny;
}
//반복문 탈출 후, 정답에 각각 x,y 최종 좌표 담기
answer[0] = x;
answer[1] = y;
return answer;
}
//실행 메인
public static void main(String[] args){
Solution2 T = new Solution2();
int[][] arr1 = {{0, 0, 0, 0, 0},
{0, 1, 1, 0, 0},
{0, 0, 0, 0, 0},
{1, 0, 1, 0, 1},
{0, 0, 0, 0, 0}};
System.out.println(Arrays.toString(T.solution(arr1, 10)));
int[][] arr2 = {{0, 0, 0, 1, 0, 1},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 1},
{1, 1, 0, 0, 1, 0},
{0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0}};
System.out.println(Arrays.toString(T.solution(arr2, 20)));
int[][] arr3 = {{0, 0, 1, 0, 0},
{0, 1, 0, 0, 0},
{0, 0, 0, 0, 0},
{1, 0, 0, 0, 1},
{0, 0, 0, 0, 0}};
System.out.println(Arrays.toString(T.solution(arr3, 25)));
}
}
'알고리즘 이론 [개념] > [개념] 코테 알고리즘 공부 - 시즌 2' 카테고리의 다른 글
섹션2. 해싱 & 시간 파싱 알고리즘 - (3) (0) | 2023.04.26 |
---|---|
섹션2. 해싱 & 시간 파싱 알고리즘 - (2) (0) | 2023.04.24 |
섹션2. 해싱 & 시간 파싱 알고리즘 - (1) (0) | 2023.04.20 |
섹션1. 시뮬레이션 & 구현 - (3) | 과일 가져가기 문제 풀이 (0) | 2023.04.19 |
섹션1. 시뮬레이션 & 구현 - (2) (1) | 2023.04.14 |