https://www.acmicpc.net/problem/15787
문제 요약
기차 개수 : N개
좌석 수 :20개
명령 개수 : M개
명령 종류 4가지
1. i번째 기차, x번째 좌석에 사람 태우기 (이미 사람 있으면 x)
2. i번째 기차, x번째 좌석에 앉은 사람 하차 (사람이 없으면 x)
3. i번째 기차, k번째 앉은 사람 -> k+1번째로 고객 모두 이동, 단 20번째 자리에 사람이 앉아 있었다면 이 사람은 하차한다.
4. i번째 기차, k번째 앉은 사람 -> k-1번째로 고객 모두 이동, 단 1번째 자리에 사람이 앉아 있었다면 하차
기차별로 배치가 다 달라야한다.
만약 1번 기차에 앉은 좌석 배치와 3번 기차에 앉은 좌석 배치 순서가 같다면, 3번 기차는 은하수를 건널 수 없다.
문제 접근 방식
간단한 구현 문제였다.
시행 착오
3번, 4번 명령을 실행할 때
아래와 같이 로직을 작성했다
분명히 맞게 입력했는데
왜 안될까 곰곰히 생각해보니
오류가 있다는 걸 깨달았다.
3번 명령어가 실행되면
k번째 앉아 있는 사람이 k+1번째로 이동하게 된다.
앞에서부터 값을 변경시키면
원본 값이 아닌 이미 변경된 값으로
값이 주입이 된다.
그래서 이때는 거꾸로 끝에서부터 진행을 해줘야한다.
4번 명령어에서는 3번 명령어와는 반대로
앞에서부터 진행해주면
문제 없이 코드가 실행된다.
소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashSet; import java.util.Set; import java.util.StringTokenizer; public class Main { static int N; static int M; static boolean[][] trainArr; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N=Integer.parseInt(st.nextToken()); // 기차의 개수 M=Integer.parseInt(st.nextToken()); // 명령의 개수 trainArr=new boolean[N+1][21]; // 1~20번 좌석 for (int i = 0; i < M; i++) { // 명령 번호, 기차 번호, 좌석 번호 st=new StringTokenizer(br.readLine()); int mNum=Integer.parseInt(st.nextToken()); int trainNum=Integer.parseInt(st.nextToken()); if (mNum==1) { // i번째 기차, x번째 좌석에 사람 태우기 (이미 사람 있으면 x) int seatNum=Integer.parseInt(st.nextToken()); trainArr[trainNum][seatNum]=true; }else if(mNum==2) { // i번째 기차, x번째 좌석에 앉은 사람 하차 (사람이 없으면 x) int seatNum=Integer.parseInt(st.nextToken()); trainArr[trainNum][seatNum]=false; }else if(mNum==3) { // k번째 앉은 사람 -> k+1번째로 고객 모두 이동 for (int j = 20; j >=2 ; j--) { trainArr[trainNum][j]=trainArr[trainNum][j-1]; } trainArr[trainNum][1]=false; }else if(mNum==4){ // k번째 앉은 사람 -> k-1번째로 고객 모두 이동 for (int j = 1; j <20; j++) { trainArr[trainNum][j]=trainArr[trainNum][j+1]; } trainArr[trainNum][20]=false; } } Set<String> set = new HashSet<>(); for (int i = 1; i <= N; i++) { String temp=""; for (int j = 1; j <= 20; j++) { if(trainArr[i][j]) temp+="1"; else temp+="0"; } set.add(temp); } System.out.println(set.size()); } } | cs |
'여니의 취준 준비 > 코딩테스트 (Java)' 카테고리의 다른 글
[14500] 테트로미노 in Java (1) | 2022.09.17 |
---|---|
[DFS/BFS] 마름모 모양 만들기 (0) | 2022.08.18 |
[*3109*] 빵집 in Java ( + Backtracking, DFS ) (0) | 2022.08.18 |
[*1992*] 쿼드트리 in Java (0) | 2022.08.18 |
[*5644*] 무선 충전 in Java (Feat. SWEA) (0) | 2022.08.17 |