Silver Star
Silver Star

백준 14891, 톱니바퀴

김은성·2022년 10월 6일
simulation 구현 삼성 SW 역량 테스트 기출 문제 시뮬레이션 알고리즘 코딩 테스트
1

삼성 SW 역량 테스트 기출 문제

목록 보기
6/25

https://www.acmicpc.net/problem/14891


1. 아이디어

구현, 시뮬레이션


1) 각 톱니바퀴 회전 여부 및 회전 방향 결정

  • [i]번 톱니바퀴 회전
    [i-1]번 톱니바퀴 확인: gears[i][6]gears[i-1][2] 비교
    [i+1]번 톱니바퀴 확인: gears[i][2]gears[i+1][6] 비교

  • 각 톱니바퀴의 회전 여부, 회전 방향을 rotateDirs[]에 저장

2) 저장된 rotateDirs[]에 따라, 회전시킬 톱니바퀴 회전

① 시계 방향 회전

  • gears[gearIdx][]를 오른쪽으로 shift

② 반시계 방향 회전

  • gears[gearIdx][]를 왼쪽으로 shift



2. 자료구조

  • int[][] gears: 각 톱니바퀴의 톱니 상태
    => gears[i]: [i]번 톱니바퀴의 톱니 상태

  • Command[] commands: 입력 회전 명령
    Command: 톱니바퀴 번호 gearIdx, 회전 방향 rotateDir

  • int[] rotateDirs: 각 톱니바퀴 회전 여부 및 회전 방향 저장



코드

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

class Command {
	public int gearIdx;			// 톱니바퀴 번호
	public int rotateDir;		// 회전 방향

	public Command(int gearIdx, int rotateDir) {
		this.gearIdx = gearIdx;
		this.rotateDir = rotateDir;
	}
}

public class Main {
	static int[][] gears;				// 각 톱니바퀴의 톱니 상태
	static int k;						// 톱니바퀴 회전 횟수
	static Command[] commands;			// 입력 회전 명령
	static int scores;

	static boolean[] visited;
	static int[] rotateDirs;
	static final int N = 0, S = 1;
	static final int CLOCK = 1, COUNTER_CLOCK = -1;		// 회전 방향

	static void solution() {
		for (Command command : commands) {
			// 1) 각 톱니바퀴 회전 여부 및 회전 방향 확인
			visited = new boolean[5];		// Init
			rotateDirs = new int[5];

			visited[command.gearIdx] = true;
			rotateDirs[command.gearIdx] = command.rotateDir;
			checkRotate(command.gearIdx, command.rotateDir);

			// 2) 체크한 rotateDirs[]에 따라, 회전시킬 톱니바퀴 회전
			for (int gearIdx = 1; gearIdx <= 4; gearIdx++) {
				if (rotateDirs[gearIdx] == CLOCK) {
					rotateClock(gearIdx);
				}
				else if (rotateDirs[gearIdx] == COUNTER_CLOCK) {
					rotateCounterClock(gearIdx);
				}
			}
		}

		// k번 회전 끝난 후, 점수 계산
		if (gears[1][0] == S) scores += 1;
		if (gears[2][0] == S) scores += 2;
		if (gears[3][0] == S) scores += 4;
		if (gears[4][0] == S) scores += 8;
	}

	/* gearIdx번 톱니바퀴가 rotateDir 방향으로 회전할 경우,
	양 옆 톱니바퀴 회전 여부 및 방향 체크 */
	static void checkRotate(int gearIdx, int rotateDir) {
		int leftGearIdx = gearIdx - 1;
		int rightGearIdx = gearIdx + 1;
		// 양 옆 톱니바퀴가 회전한다면, 회전 방향은 반대가 됨
		int otherRotateDir = (rotateDir == CLOCK) ? COUNTER_CLOCK : CLOCK;

		if (leftGearIdx >= 1 && !visited[leftGearIdx] &&
				gears[gearIdx][6] != gears[leftGearIdx][2]) {
			visited[leftGearIdx] = true;
			rotateDirs[leftGearIdx] = otherRotateDir;
			checkRotate(leftGearIdx, otherRotateDir);
		}

		if (rightGearIdx <= 4 && !visited[rightGearIdx] &&
				gears[gearIdx][2] != gears[rightGearIdx][6]) {
			visited[rightGearIdx] = true;
			rotateDirs[rightGearIdx] = otherRotateDir;
			checkRotate(rightGearIdx, otherRotateDir);
		}
	}

	/* gearIdx번 톱니바퀴를 시계 방향으로 회전 */
	static void rotateClock(int gearIdx) {
		// gears[gearIdx][]를 오른쪽으로 shift
		int temp = gears[gearIdx][7];
		for (int i = 7; i > 0; i--) {
			gears[gearIdx][i] = gears[gearIdx][i - 1];
		}
		gears[gearIdx][0] = temp;
	}

	/* gearIdx번 톱니바퀴를 반시계 방향으로 회전 */
	static void rotateCounterClock(int gearIdx) {
		// gears[gearIdx][]를 왼쪽으로 shift
		int temp = gears[gearIdx][0];
		for (int i = 0; i < 7; i++) {
			gears[gearIdx][i] = gears[gearIdx][i + 1];
		}
		gears[gearIdx][7] = temp;
	}

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(
				new InputStreamReader(System.in)
		);
		StringTokenizer st;

		gears = new int[5][8];			// [1] ~ [4] 사용
		for (int i = 1; i <= 4; i++) {
			String input = br.readLine();

			for (int j = 0; j < 8; j++) {
				gears[i][j] = Character.getNumericValue(input.charAt(j));
			}
		}

		k = Integer.parseInt(br.readLine());

		commands = new Command[k];
		for (int i = 0; i < k; i++) {
			st = new StringTokenizer(br.readLine());
			int gearIdx = Integer.parseInt(st.nextToken());
			int rotateDir = Integer.parseInt(st.nextToken());

			commands[i] = new Command(gearIdx, rotateDir);
		}

		solution();

		System.out.println(scores);
	}
}
profile
김은성
Silver Star
이전 포스트

백준 14503, 로봇 청소기

다음 포스트

백준 17140, 이차원 배열과 연산

0개의 댓글

装修网房子简装效果图年夜饭摆盘装饰成都100平米装修多少钱广州市装饰装修公司简装纸尿裤达州市昱帆装饰泉州华浔装饰长沙民宿装修设计津市装修公司世茂江海天成是简装还是精装公装招标家居设计深圳公装公司简装精装潜江装修装饰别墅三层装修设计精装修房子精装价格装修装饰简装湛江装饰装修公司中式仿古简装100平米三房装修,装饰大同装饰装修公司丹东装修一般简装装饰公司绵阳90平米简装多少钱粉墙装修安庆装修公司服务电话武汉装修公司装修简装装修房子香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声汪小菲曝离婚始末卫健委通报少年有偿捐血浆16次猝死单亲妈妈陷入热恋 14岁儿子报警雅江山火三名扑火人员牺牲系谣言手机成瘾是影响睡眠质量重要因素男子被猫抓伤后确诊“猫抓病”中国拥有亿元资产的家庭达13.3万户高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了男孩8年未见母亲被告知被遗忘张家界的山上“长”满了韩国人?倪萍分享减重40斤方法许家印被限制高消费网友洛杉矶偶遇贾玲何赛飞追着代拍打小米汽车超级工厂正式揭幕男子被流浪猫绊倒 投喂者赔24万沉迷短剧的人就像掉进了杀猪盘特朗普无法缴纳4.54亿美元罚金周杰伦一审败诉网易杨倩无缘巴黎奥运专访95后高颜值猪保姆德国打算提及普京时仅用姓名西双版纳热带植物园回应蜉蝣大爆发七年后宇文玥被薅头发捞上岸房客欠租失踪 房东直发愁“重生之我在北大当嫡校长”校方回应护栏损坏小学生课间坠楼当地回应沈阳致3死车祸车主疑毒驾事业单位女子向同事水杯投不明物质路边卖淀粉肠阿姨主动出示声明书黑马情侣提车了奥巴马现身唐宁街 黑色着装引猜测老人退休金被冒领16年 金额超20万张立群任西安交通大学校长王树国卸任西安交大校长 师生送别西藏招商引资投资者子女可当地高考胖东来员工每周单休无小长假兔狲“狲大娘”因病死亡外国人感慨凌晨的中国很安全恒大被罚41.75亿到底怎么缴考生莫言也上北大硕士复试名单了专家建议不必谈骨泥色变“开封王婆”爆火:促成四五十对测试车高速逃费 小米:已补缴天水麻辣烫把捣辣椒大爷累坏了

装修网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化