15662번 톱니바퀴 (2)  71.87%

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <vector>
#include <stdbool.h>
#include <iostream>

using namespace std;

void rot_right(); void rot_left();

int gear[1000][8];
int gear_tmp[8];
int right_gear, left_gear;


int main() {
	int gear_num; // 톱니바퀴 갯수
	int rot_num; // 회전 횟수
	int a;
	
	// vector<vector<int>> v;

	scanf("%d", &gear_num);	// 기어 갯수 입력 

	// 톱니바퀴 세팅
	for (int i = 0; i < gear_num; i++) {
		scanf("%d", &a);	// 기어 N극, S극 받음
		for (int j = 0; j < 8;j++) {
			gear[i][7 - j] = a % 10;
			a = a / 10;
		}
	}

	scanf("%d", &rot_num);	// 회전 횟수 입력 

	// 0. 회전 반복
	for (int i = 0; i < rot_num; i++) {
		int pick;	// 선택 기어
		int dir; // 시계: 1, 반시계: -1				
		
		scanf("%d %d", &pick, &dir);
		int pick_gear= pick-1; // 선택 기어의 배열

		// 0. 회전 범위 체크
		// 0-1. 픽업 기준 왼쪽 체크
		left_gear = 0;
		for (int k = pick_gear; (left_gear == 0) && (k > 0); k--) {
			// k=1 일 때의 예외처리
			if (k == 1) {
				if (gear[0][2] != gear[k][6]) {
					left_gear = 0;
				}
				else left_gear = 1;
			}
			// 왼쪽 톱니바퀴의 극성이 같을 경우
			else if (gear[k - 1][2] == gear[k][6]) {
				left_gear = k;
			}
			// 다르면 계속 진행
		}
		// 0-2. 오른쪽 체크
		right_gear = gear_num-1;
		for (int k = pick_gear; (right_gear == gear_num-1) && (k < gear_num-1); k++) {
			// 가장 오른쪽 톱니 비교
			if (k == gear_num-2) {
				if (gear[k][2] != gear[gear_num-1][6]) {
					right_gear = gear_num-1;
				}
				else right_gear = k;
			}
			// 극성이 같을 경우
			else if (gear[k][2] == gear[k + 1][6]) {
				right_gear = k;
			}
			// 왼쪽 톱니바퀴의 극성이 다를 경우	
			
		}
		// 1. 회전
		// 1-1. 우회전을 대입했을 때
		if (dir == 1) {
			for (int k = left_gear; k <= right_gear; k++) {
				// 한 행 = 기어 복사
				for (int j = 0; j < 8; j++) {
					gear_tmp[j] = gear[k][j];
				}
				// 좌, 우 회전
				if (abs(k - pick_gear) % 2 == 0) {
					rot_right();
				}
				else  {
					rot_left();
				}
				// 다시 대입
				for (int j = 0; j < 8; j++) {
					gear[k][j] = gear_tmp[j];
				}
			}
		}
		// 1-2. 좌회전을 대입했을 때
		else if (dir == -1) {
			for (int k = left_gear; k <= right_gear; k++) {
				// 한 행 = 기어 복사
				for (int j = 0; j < 8; j++) {
					gear_tmp[j] = gear[k][j];
				}
				// 좌, 우 회전
				if (abs(k - pick_gear) % 2 == 0) {
					rot_left();
				}
				else {
					rot_right();
				}
				// 다시 대입
				for (int j = 0; j < 8; j++) {
					gear[k][j] = gear_tmp[j];
				}
			}
		}	// 좌회전, 우회전 END
	}	// 회전 반복 END

	// 2. S극(1) 카운팅
	int cnt = 0;
	for (int i = 0; i < gear_num; i++) {
		if (gear[i][0]) {
			cnt++;
		}
	}
	printf("%d", cnt);
	////////////////////////////////

	/*printf("\n디버깅");
	printf("왼쪽= %d, 오른쪽= %d\n", left_gear, right_gear);
	printf("바뀐 톱니\n");
	for (int k = 0; k < gear_num; k++) {
		for (int i = 0; i < 8; i++) {
			if (gear[k][i] == 1) {
				printf("1");
			}
			else {
				printf("0");
			}
		}
		printf("\n");
	}*/

}

void rot_right() {
	bool tmp = gear_tmp[7];
	for (int i = 7; i >= 1; i--) {
		gear_tmp[i] = gear_tmp[i - 1];
	}
	gear_tmp[0] = tmp;
}
void rot_left() {
	bool tmp = gear_tmp[0];
	for (int i = 0; i <= 6; i++) {
		gear_tmp[i] = gear_tmp[i + 1];
	}
	gear_tmp[7] = tmp;
}
    1. 구구단 N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main() {
    	int a;
    	scanf("%d",&a);
    
    	for (int i = 1; i < 10; i++) {
    		printf("%d * %d = %d\\n", a, i,a * i);
    	}
    }
    
    1. A+B -3 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
  • #define _CRT_SECURE_NO_WARNINGS
    #include <vector>
    #include <stdio.h>
    
    int main() {
    	int a, b, t;
    	
    		scanf("%d",&t);
    	for (int i = 0; i < t; i++) {
    		scanf("%d %d", &a, &b);
    		printf("%d\\n", a+b);
    	}
    	
    }
    
    1. 합 n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.
  • #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main() {
    	int a;
    	int sum = 0;
    	scanf("%d", &a);
    
    	for (int i = 1; i <= a; i++) {
    		sum = sum + i;
    	}
    	printf("%d", sum);
    	
    }
    
    1. 빠른 A+B
    2. #define _CRT_SECURE_NO_WARNINGS
      #include <vector>
      #include <stdio.h>
      
      int main() {
      	unsigned int a, b, t;
      
      	scanf("%d", &t);
      	for (int i = 0; i < t; i++) {
      		scanf("%d %d", &a, &b);
      		printf("%d\\n", a + b);
      	}
      
      }
      
    1. N 찍기 자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
  • #define _CRT_SECURE_NO_WARNINGS
    #include <vector>
    #include <stdio.h>
    
    int main() {
    	unsigned int a, t;
    
    	scanf("%d", &t);
    	for (int i = 1; i <= t; i++) {
    		printf("%d\\n", i);
    	}
    }
    
    1. 기찍 N 자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
  • #define _CRT_SECURE_NO_WARNINGS
    #include <vector>
    #include <stdio.h>
    
    int main() {
    	unsigned int a, t;
    
    	scanf("%d", &t);
    	for (int i = t; i > 0; i--) {
    		printf("%d\\n", i);
    	}
    
    }
    
    1. A+B -7 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
  • #define _CRT_SECURE_NO_WARNINGS
    #include <vector>
    #include <stdio.h>
    
    int main() {
    	unsigned int a,b, t;
    
    	scanf("%d", &t);
    	for (int i = 0; i <t; i++) {
    		scanf("%d %d", &a, &b);
    				printf("Case #%d: %d\\n", i+1, a+b);
    	}
    }
    
    1. A+B - 8 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
  • #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main() {
    	unsigned int a,b, t;
    
    	scanf("%d", &t);
    	for (int i = 0; i <t; i++) {
    		scanf("%d %d", &a, &b);
    		printf("Case #%d: %d + %d = %d\\n", i+1,a,b, a+b);
    	}
    
    }
    
    1. 별 찍기 - 1 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제
  • #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main() {
    	unsigned int a;
    
    	scanf("%d", &a);
    	for (int i = 1; i <=a; i++) {
    		for (int j = 1; j <= i; j++) {
    			printf("*");
    		}
    		printf("\\n");
    	}
    }
    
    1. 별 찍기 - 2 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제. 하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.
  • #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main() {
    	unsigned int a;
    
    	scanf("%d", &a);
    	for (int i = 1; i <=a; i++) { //a 배열을 만들겠다
    		for (int j = 1; j <= a-i; j++) { //a-i까지 띄워쓰기 하겠다
    			printf(" ");
    		}
    		for (int j = a-i+1 ; j <= a; j++) {  // a-i+1부터 A까지 * 입력
    			printf("*");
    		}
    		printf("\\n");
    	}
    }
    // 1~a까지 배열을 만들고 i번째 줄> 오른 쪽에서 첫 번째(a-i)
    // 그 다음 (a-i+1)부터 a까지 * 기입

 

https://www.acmicpc.net/step/4

 

if문 단계

점이 어느 사분면에 있는지 알아내는 문제

www.acmicpc.net

1330. 두 수 비교하기

두 정수 A와 B가 주어졌을 때, A와 B를 비교하는 프로그램을 작성하시오.

  • A가 B보다 큰 경우에는 '>'를 출력한다.
  • A가 B보다 작은 경우에는 '<'를 출력한다.
  • A와 B가 같은 경우에는 '=='를 출력한다.
    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    int main() {
    	int a, b;
    
    	scanf("%d %d", &a, &b);
    	
    	if (a > b) { printf(">"); }
    	if (a < b) { printf("<"); }
    	if (a == b) { printf("=="); }
    }​

9498. 시험 성적

시험 점수를 입력받아 90 ~ 100점은 A, 80 ~ 89점은 B, 70 ~ 79점은 C, 60 ~ 69점은 D, 나머지 점수는 F를 출력하는 프로그램을 작성하시오.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int a;
	scanf("%d", &a);
	
	if (a >=90) { printf("A"); }
	else if (a >= 80) { printf("B"); }
	else if (a >= 70) { printf("C"); }
	else if (a >= 60) { printf("D"); }
	else { printf("F"); }
	
}

2753. 윤년

연도가 주어졌을 때, 윤년이면 1, 아니면 0을 출력하는 프로그램을 작성하시오.

윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.

예를 들어, 2012년은 4의 배수이면서 100의 배수가 아니라서 윤년이다. 1900년은 100의 배수이고 400의 배수는 아니기 때문에 윤년이 아니다. 하지만, 2000년은 400의 배수이기 때문에 윤년이다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int a;
	scanf("%d", &a);
	
	if (a % 400 == 0) { //400의 배수의 값이 제일 적다.
		printf("1");
	}
	else if (a % 100 == 0) { //그 다음은 100의 배수이다.
		printf("0");
	}
	else if (a % 4 == 0) {
		printf("1");
	}
	else { printf("0"); } //윤년 조건을 모두 걸러냈으면 나머지는 모두 윤년이 아니다.
}

제일 조건이 까다로운 것(400의 배수)부터 시작하여 else if로 구분지었습니다.

 

14681. 사분면 고르기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int x,y;
	scanf("%d", &x);
	scanf("%d", &y);
	
	if (x > 0) {
		if (y > 0) printf("1");
		if (y < 0) printf("4");
	}
	if (x < 0) {
		if (y > 0) printf("2");
		if (y < 0) printf("3");
	}
}

 

2884. 알람 시계

바로 "45분 일찍 알람 설정하기"이다.

이 방법은 단순하다. 원래 설정되어 있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피 알람 소리를 들으면, 알람을 끄고 조금 더 잘 것이기 때문이다. 이 방법을 사용하면, 매일 아침 더 잤다는 기분을 느낄 수 있고, 학교도 지각하지 않게 된다.

현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int h,m;
	scanf("%d %d",&h,&m);

	m = m - 45;

	if (m < 0) {
		m = 60 + m;
		h = h - 1;
		if (h < 0) { h = 24 + h; }
	}
	printf("%d %d", h, m);
} 
//if문으로 m>0, m<0, h<0일 때마다 printf를 썼는데 생각해보니 한 줄로 줄일 수 있었습니다.

 

https://www.acmicpc.net/step/1

 

2557. Hello World!를 출력하시오.

#include <stdio.h>


int main() {
	printf("Hello World!");
}

 

10718.  We love kriii

ACM-ICPC 인터넷 예선, Regional, 그리고 World Finals까지 이미 2회씩 진출해버린 kriii는 미련을 버리지 못하고 왠지 모르게 올해에도 파주 World Finals 준비 캠프에 참여했다.

대회를 뜰 줄 모르는 지박령 kriii를 위해서 격려의 문구를 출력해주자.

#include <stdio.h>


int main() {
	printf("강한친구 대한육군\n강한친구 대한육군");
}

 

10171. 고양이

아래 예제와 같이 고양이를 출력하시오.

#include <stdio.h>


int main() {
	printf("\\    /\\ \n");
printf(" )  ( ') \n");
printf("(  /  ) \n");
printf(" \\(__)|\n");
}

 

10172. 개

아래 예제와 같이 개를 출력하시오.

#include <stdio.h>

int main() {
printf("|\\_/|\n");
printf("|q p|   /}\n");
printf("( 0 )\"\"\"\\\n");
printf("|\"^\"`    |\n");
printf("||_/=\\\\__|\n");
}

 

1000. A+B

#include <stdio.h>


int main() {
	int a, b;
	scanf("%d", &a);
	scanf("%d", &b);

	printf("%d", a + b);
}

 

1001. A-B

#include <stdio.h>


int main() {
	int a, b;
	scanf("%d", &a);
	scanf("%d", &b);

	printf("%d", a - b);
}

 

10998. A*B

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main() {
	int a, b;
	scanf("%d %d", &a, &b);
	
	
	printf("%d", a*b);
}

 

1008. A/B

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main() {
	int a, b;
	scanf("%d %d", &a, &b);
	
	
	printf("%.9lf", (double)a/b);
}

상대오차가 10-9 이하

따라서 float는 7자리까지라라서 double로 써야 하고 %d도 %lf으로 써야한다.

 

10869. 사칙연산

두 자연수 A와 B가 주어진다. 이때, A+B, A-B, A*B, A/B(몫), A%B(나머지)를 출력하는 프로그램을 작성하시오. 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main() {
	int a, b;
	scanf("%d %d", &a, &b);
	
	
	printf("%d\n", a+b);
	printf("%d\n", a - b);
	printf("%d\n", a * b);
	printf("%d\n", a / b);
	printf("%d\n", a % b);
}

 

10430. 나머지

(A+B)%C는 ((A%C) + (B%C))%C 와 같을까?

(A×B)%C는 ((A%C) × (B%C))%C 와 같을까?

세 수 A, B, C가 주어졌을 때, 위의 네 가지 값을 구하는 프로그램을 작성하시오.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main() {
	int a, b, c;
	scanf("%d %d %d", &a, &b, &c);
	
	
	printf("%d\n", (a + b) % c);
	printf("%d\n", ((a % c) + (b % c)) % c);
	printf("%d\n", (a*b) % c);
	printf("%d\n", ((a % c) *(b % c)) % c);
	
}

 

2588. 곱셈

(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.

(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6)위치에 들어갈 값을 구하는 프로그램을 작성하시오.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main() {
	int a, b, c;
	scanf("%d", &a);
	scanf("%d", &b);
	
	int tmp1, tmp2, tmp3;
	tmp1 = a * (b % 10); //1의 자리
	tmp2 = a * ((b % 100 - (b % 10))/10); // 10의 자리
	tmp3 = a * ((b - (b % 100 ))/100);

	printf("%d\n", tmp1);
	printf("%d\n", tmp2);
	printf("%d\n", tmp3);
	printf("%d\n", a*b);
	
}

 

문제를 풀기 전에는 정답을 볼 수가 없어서 다른 분들 참고하시라고 올려요

+ Recent posts