회원가입
로그인
Toggle navigation
문제
문제
전체 문제
문제 출처
단계별로 풀어보기
알고리즘 분류
추가된 문제
문제 순위
문제
푼 사람이 한 명인 문제
아무도 못 푼 문제
최근 제출된 문제
최근 풀린 문제
랜덤
출처
ICPC
Olympiad
한국정보올림피아드
한국정보올림피아드시․도지역본선
전국 대학생 프로그래밍 대회 동아리 연합
대학교 대회
카카오 코드 페스티벌
Coder's High
ICPC
Regionals
World Finals
Korea Regional
Africa and the Middle East Regionals
Europe Regionals
Latin America Regionals
North America Regionals
South Pacific Regionals
문제집
대회
1
채점 현황
랭킹
게시판
그룹
더 보기
재채점 기록
블로그
강의
실험실
도움말
BOJ Stack
BOJ Book
전체
공지
자유
질문
오타/오역/요청
게시판 공지
홍보
업데이트
solved.ac
글쓰기
질문 도움말
자주묻는 질문
톱니바퀴문제 어떻게 고쳐야 할지..
14891번 - 톱니바퀴
ty5gh
6년 전
0
톱니바퀴 문제를 풀고있습니다. 예제로 나오는 테스트케이스는 문제없이 돌아가는데 채점결과는 틀렸습니다가 나오네요.
다른 함수는 문제없는 것 같은데 메인함수의 while문에서 오류가 나는 것 같습니다.
돌아가는 방식을 설명드리자면, 예를 들어 처음에 3번 톱니와 1번 방향을 입력받았다고 한다면
1. 3번톱니를 입력받은 방향대로 돌림
2. 첫번째 while문에서 3번보다 높은 번호의 톱니(즉4번톱니)의 극일치를 판단 후 돌림
3. 두번째 while문에서 3본보다 낮은 번호의 톱니(즉1,2번톱니)의 극일치를 판단 후 돌림
4. 위의 방식을 입력받은 횟수만큼 반복
이런식으로 코드를 짤 생각이었는데 혹시 문제풀이의 방향이 잘못된걸까요?
#include<stdio.h> int toot[4][8] = {0},toot_c[3]; //toot_c배열에는 톱니바퀴가 맞닫는 곳의 극일치여부를 저장 1은같은극 0은 다른극 void toot_compare(); //toot_c배열에 극일치여부를 저장하는 함수. int t_Right(int i);//오른쪽으로 한 칸돌림 int t_Left(int i);//왼쪽으로 한 칸돌림 int Score(); //점수내는 함수. int main(void){ int num, t_num, dir, i, j, tmp; //num은 돌아가는 횟수, t_num은 바퀴의 번호. int score; for(i =0; i<4; i++){ for(j=0; j<8; j++){ scanf("%1d", &toot[i][j]); } } scanf("%d", &num); for(i =0; i<num; i++){ scanf("%d %d", &t_num, &dir); tmp = t_num; //tmp에 톱니바퀴 번호를 임시로 저장 후에 첫번째 while을 나온후 다시 값을 지정해주기위함. toot_compare(); //극일치 여부 저장. if(dir == 1){ t_Right(t_num-1); } else t_Left(t_num-1); //t_num으로 입력받은 톱니바퀴를 먼저 돌림. while(t_num != 4){ //나머지 톱니바퀴를 toot_c배열에 참조하여 나머지톱니를 돌림. if(t_num>4 || t_num<0) break; if(dir==1){ if(toot_c[t_num-1] == 0){ t_Left(t_num); dir=-1; } else break; } else if(dir==-1){ if(toot_c[t_num-1] == 0){ t_Right(t_num); dir=1; } else break; } t_num = t_num+1; } t_num = tmp; //바뀐 t_num값을 원래 값으로 초기화해줌. while(t_num != 1){ if(t_num>4 || t_num<0) break; if(dir==1){ if(toot_c[t_num-2] == 0){ t_Left(t_num-2); dir=-1; } else break; } else if(dir==-1){ if(toot_c[t_num-2] == 0){ t_Right(t_num-2); dir = 1; } else break; } t_num = t_num-1; } } score = Score(); printf("%d\n", score); } void toot_compare(){ int i,j; for(i=0; i<4; i++){ if(toot[i][2] == toot[i+1][6]){ toot_c[i] = 1; } else toot_c[i] = 0; } } int t_Right(int i){ int tmp; tmp = toot[i][7]; for(int j = 6; j>=0; j--){ toot[i][j+1] = toot[i][j]; } toot[i][0] = tmp; } int t_Left(int i){ int tmp; tmp = toot[i][0]; for(int j=1; j<8; j++){ toot[i][j-1] = toot[i][j]; } toot[i][7] = tmp; } int Score(){ int score = 0; if (toot[0][0]==1){ score = score +1; } if (toot[1][0]==1){ score = score +2; } if (toot[2][0]==1){ score = score +4; } if (toot[3][0]==1){ score = score +8; } return score; }
댓글을 작성하려면
로그인
해야 합니다.
ty5gh 6년 전