회원가입
로그인
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
글쓰기
질문 도움말
자주묻는 질문
[C] 예제는 잘 되는데 틀렸다고 뜹니다.
8958번 - OX퀴즈
xs0512
2년 전
0
예제는 잘됩니다 ㅠㅠ
어떤 문제가 있어서 틀렸다고 뜨는걸까요??
#include <stdio.h> int main(void) { int n; int cnt=0, sum=0; scanf("%d", &n); char a[80] = { 0 }; for (int i = 0; i < n; i++) { scanf("%s", a,sizeof(a)); for (int i=0; i<80; i++) { if (a[i] == 'O') { cnt++; sum += cnt; } else { cnt = 0; } } printf("%d\n", sum); sum = 0; } return 0; }
dldyddlwl
2년 전
1
정말 잘 하셨는데요! 아래 부분만 한번 참고해주세요.
for (int i = 0; i < n; i++) { scanf("%s", a,sizeof(a)); // include <string.h> 헤더를 이용하여 strlen 함수를 불러옵시다! // int my_var = strlen(a); => a라는 문자열의 길이를 리턴해줍니다. // EX) OOOXXX 라는 문자열을 strlen 함수를 사용하면 6을 리턴해줍니다. // for (int i = 0; i < my_var; i++) => 필요한 길이만! for (int i=0; i<80; i++) // a의 길이가 아닌 무조건 80까지 하면 위험합니다! 따라서, strlen을 써서 { // a의 길이만큼(my_var)만 씁시다 // a의 길이만큼이 아닌 무조건 80으로 쓸 경우 위험한 이유는 무엇일까요? // 자, 2개의 테스트케이스를 받는다고 합시다. 첫 번째 케이스를 OXXXXXXXXOO라고 해봅시다. // 그리고 두 번째 케이스는 O라고 하죠. // 그런데 말입니다. scanf는 필요한만큼만 문자열을 끊어줍니다. // 첫 번째 테스트케이스의 scanf를 통해서는 a = "OXXXXXXXXOO" 그리고 널 터미네이터(\0) 입니다. // 그리고 그 뒤의 공간은 비어있죠. // 즉, a의 원소는 O,X,X,X,X,X,X,X,X,O,O,\0 입니다. ( 그 후는 다 0이죠! => 처음 0으로 초기화됐으므로 ) // 참고) null terminator, 널터미네이터는 문자열의 끝을 알려주는 친구입니다. // 그리고, 두 번째 테스트케이스의 scanf를 통해서는 a가 "O" 그리고 널 터미네이터입니다. // 그런데, a의 뒷공간은 그대로 남아있습니다!!! 이럴수가, 다음을 보시죠. // a의 원소는 O, \0, X,X,X,X,X,X,X,O,O 가 되는 것입니다. (scanf는 뒷공간은 신경을 안쓰고 현재만 고려함! ) // 자, 이제 문제가 보이시나요? // i가 0부터 80 이전까지 진행하게 되면, 이전에 남아있는 입력까지 보게 된다는 것입니다. // 두 번째 테스트케이스가 진행될 때, O만 보고 끝나야하는데, (i가 80전까지이므로) 그 뒤 공간까지 // 보게 되면서 문제가 되는 겁니다! if (a[i] == 'O') { cnt++; sum += cnt; } else { cnt = 0; } } printf("%d\n", sum); sum = 0; // cnt = 0; // cnt 또한 0으로 초기화해줘야만 하는데요. 그 이유는 이전 테스트 케이스가 "O"로 끝나게 되면 // 이전의 cnt가 남아있기 때문에, 비워주셔야 합니다! }
댓글을 작성하려면
로그인
해야 합니다.
xs0512 2년 전
예제는 잘됩니다 ㅠㅠ
어떤 문제가 있어서 틀렸다고 뜨는걸까요??