땅지원
땅지원's Personal blog
땅지원
전체 방문자
오늘
어제
  • 전체 (353)
    • Frontend (2)
      • React (2)
    • Backend (90)
      • Java (16)
      • Python (19)
      • Spring (23)
      • Database (21)
      • Troubleshooting (8)
    • DevOps (27)
      • ELK (13)
    • CS (40)
    • OS (2)
      • Linux (2)
    • Algorithm (95)
      • concept (18)
      • Algorithm Problem (77)
    • 인공지능 (25)
      • 인공지능 (12)
      • 연구노트 (13)
    • 수업정리 (35)
      • 임베디드 시스템 (10)
      • 데이터통신 (17)
      • Linux (8)
    • 한국정보통신학회 (5)
      • 학술대회 (4)
      • 논문지 (1)
    • 수상기록 (8)
      • 수상기록 (6)
      • 특허 (2)
    • 삼성 청년 SW 아카데미 (6)
    • 42seoul (12)
    • Toy project (3)
    • 땅's 낙서장 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • 20.11.6 BB21플러스 온라인 학술대회
  • 20.10.30 한국정보통신학회 온라인 학술대회

인기 글

태그

  • D
  • I
  • E
  • 이것이 리눅스다 with Rocky Linux9
  • ㅗ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
땅지원

땅지원's Personal blog

Algorithm/Algorithm Problem

백준 20055 컨베이어 벨트 위의 로봇(구현)

2022. 9. 3. 15:49
 

20055번: 컨베이어 벨트 위의 로봇

길이가 N인 컨베이어 벨트가 있고, 길이가 2N인 벨트가 이 컨베이어 벨트를 위아래로 감싸며 돌고 있다. 벨트는 길이 1 간격으로 2N개의 칸으로 나뉘어져 있으며, 각 칸에는 아래 그림과 같이 1부

www.acmicpc.net

걸린시간 : 1시간 30분

문제자체는 어렵지 않았는데 어떤 자료구조를 써야되는지 확실하게 정하지 못하고 고민을 너무 많이 하다가시간을 많이 썼다.

 원형 돌리기를 만나면 자꾸 python의 deque.rotate()를 먼저 생각하는 버릇이 있어서 Java에서

Collections.rotate()를
 쓰려는 버릇이 있는데 고쳐야겠다고 생각이 들었다.

----유의해야할점----
 robot은 n-1에서 무조껀 빠지기 때문에 robot을 관리하는 배열의 길이는 n까지면 된다


 회전을 시킬 때 index를 앞에서가 아니라 뒤에서 부터 접근해야한다
 why?)
 우리는 belt,robot을 시계방향으로 돌릴껀데 for문도 시계방향(0 to 2*n)으로 돌리면 문제가 생김
 ex) i=0에 있는 로봇을 i=1로 옮김(이 로봇은 더이상 움직이면 안됨)
 근데 다음 for문의 index가 i=1이라서 i=0 to i=1로 이동한 로봇에 대해서 또 움직이려함
 so, for문을 뒤에서 부터 돌려 회전 시켜야됨 ==> 맨날 rotate만 쓰다보니 이 부분 구현하는데 시간을 오래씀

package practice;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_20055 {
	static int N,K;
	static int[] belt;
	static boolean[] robot;
	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());
		K = Integer.parseInt(st.nextToken());
		
		belt = new int[2*N];
		robot = new boolean[N];
		
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < 2*N; i++) {
			belt[i] = Integer.parseInt(st.nextToken());
		}

		int res = 1;

		while (true) {
			//1.회전
			rotate();

			//2.이동
			move();

			//3.로봇 올리기
			if (!robot[0] && belt[0]>0) {
				robot[0] = true;
				belt[0]--;
			}
			
			//4.내구도 0개 검사
			if (endCheck()) {
				System.out.println(res);
				break;
			}
			res++;
		}
	}
	
	public static void rotate() {
		int temp = belt[belt.length-1];
		for (int i = belt.length-2; i > -1; i--) {
			belt[i+1] = belt[i];
		}
		belt[0] = temp;
		for (int i = N-2; i > -1; i--) {
			robot[i+1] = robot[i];
		}
		robot[0] = false;
	}
	
	public static void move() {
		//내리는 위치는 그냥 바로 내려야됨
		if(robot[N-1])
			robot[N-1] = false;
		
		//벨트랑 로봇 이동
		//이거 i=0부터 하면 0->1 정상적으로 이동했는데 다음 for문에서 i=1에 있는애 또 이동시키려고 하니까 뒤에서부터함
		for (int i = N-2; i > 0; i--) {
			if(robot[i] && !robot[i+1] && belt[i+1]>0) {
				robot[i] = false;
				robot[i+1] = true;
				belt[i+1]--;
			}
		}
	}
	
	public static boolean endCheck() {
		int cnt = 0;
		for (int i = 0; i < belt.length; i++) {
			if(belt[i] == 0)
				cnt++;
			if (cnt==K)
				return true;
		}
		return false;
		
		
	}

}

'Algorithm > Algorithm Problem' 카테고리의 다른 글

백준 2623 음악프로그램(위상정렬, DFS, BFS)  (0) 2022.09.16
백준 3967 매직 스타(DFS)  (0) 2022.09.16
백준 1956 운동(Floyd-Warshall)  (0) 2022.08.28
백준 1238 파티(최단경로 - 다익스트라)★★  (0) 2022.08.28
백준 17135 캐슬 디펜스(구현, 조합, BFS) ★★  (0) 2022.08.19
    'Algorithm/Algorithm Problem' 카테고리의 다른 글
    • 백준 2623 음악프로그램(위상정렬, DFS, BFS)
    • 백준 3967 매직 스타(DFS)
    • 백준 1956 운동(Floyd-Warshall)
    • 백준 1238 파티(최단경로 - 다익스트라)★★
    땅지원
    땅지원
    신입 개발자의 우당탕탕 기술 블로그

    티스토리툴바