일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- CNF
- 모두의네트워크
- ermodel
- truth table
- Tautology
- 진리표
- statement equivalence
- Circuit
- relationaldatabaseschema
- Decimal notation
- 명제 동치
- 모두의네트워크정리
- 모순명제
- cnn
- half adder
- Contradiction
- Gate
- 항진명제
- Digital Logic Circuits
- full adder
- 십진법
- 모두의네트워크요약
- GPT-1
- 이진법 십진법 변환
- 명제
- Binary notation
- Sentiment Analysis
- 써킷
- dnf
- Logical statement
- Today
- Total
NLP Learner in Switzerland
[C] 백준 단계별로 풀어보기 5단계 1차원 배열 7문제 본문
* 문제번호를 클릭하면 해당 문제로 이동합니다(새창)
* VS code를 사용하고 있어서 scanf_s는 모두 scanf로 바꿔 제출했습니다.
#include <stdio.h>
int main() {
int N,i,n;
scanf("%d", &N);
int min = 1000000, max = -1000000;
for (i = 0; i < N; i++) {
scanf("%d", &n);
if (n >= max) {
max = n;
}
if (n <= min){
min = n;
}
}
printf("%d %d", min,max);
}
- 1차원 배열문제니까 일단 배열부터 만들어서 시작을 했는데...
- 굳이 배열을 만들 필요가 없는 문제같아서 바꿨다. 찾아봐도 배열로 푼 사람은 없는거 같다. 왜 배열 문제일까?
#include <stdio.h>
int main() {
int i;
int array[9];
int max = 0,index;
for (i = 0; i < 9; i++) {
scanf("%d", &array[i]);
if (array[i] >= max) {
max = array[i];
index = i;
}
}
printf("%d\n%d", max,index+1);
}
- for문으로 배열의 원소를 차례대로 입력받을 수 있다.
#include <stdio.h>
int main() {
int A, B, C;
scanf("%d %d %d", &A, &B, &C);
int D = A * B * C;
int array[10] = { 0, };
int i,num;
while(D > 0){
num = D % 10;
array[num]++;
D = D / 10;
}
for (i = 0; i < 10; i++) {
printf("%d\n", array[i]);
}
}
- 할줄 모르겠어서 답 찾아봤다.
- array 초기화할 때 명령어는 array[size] = { 0, };
- mod를 사용해서 계속 나머지를 구해주고, 10으로 나눠주면서 한자리씩 앞으로 땡긴다. 이런 방법이 있구나.
- 코드 진짜 초심자라 간단한 것도 쩔쩔매나보다.... 더 노력해야지
#include <stdio.h>
int main() {
int i,n;
int array[43] = { 0, };
for (i = 0; i < 10; i++) {
scanf("%d", &n);
array[n % 42]++;
}
int count = 0;
for (i = 0; i < 43; i++) {
if (array[i] != 0) {
count++;
}
}
printf("%d", count);
}
- 이것 또한 서로 다른 나머지 갯수 세는 부분에서 막혀서 못 풀었고 다른 분 솔루션을 참고했다.
- array를 size 10으로 설정해서 mod 계산해서 넣은 후에 갯수 세는 것보다,
- 최초에 array를 szie 42로 정해서 인덱스마다 해당 mod값의 갯수가 들어가도록 하는게 나는 더 이해하기 쉬웠다.
#include <stdio.h>
int main() {
int N,i;
scanf("%d", &N);
double score[1001];
int max = 0;
for (i = 0; i < N; i++) {
scanf("%lf", &score[i]);
if (max < score[i]) {
max = score[i];
}
}
double sum = 0;
for (i = 0; i < N; i++) {
score[i] = (score[i] / max) * 100.0;
sum += score[i];
}
printf("%lf", sum/N);
}
- 문제 자체는 크게 어렵지 않은데, 데이터타입 선언이 빡세다.
- 문제에 보면 결과값이 실수임을 알 수 있으므로 float / double 중에 선택해야 한다.
- float로 선언 후 결과값 돌려봤을 때 정답하고 다르게 나온 예제가 발생해서 double로 선언했다.
#include <stdio.h>
int main() {
int N, i, j;
scanf("%d", &N);
char array[81];
for (i = 0; i < N; i++) {
scanf("%s", array, sizeof(array));
int score = 0, O = 1;
for (j = 0; j < strlen(array); j++) {
if (array[j] == 'O') {
score += O;
O++;
}
else {
O = 1;
}
}
printf("%d\n", score);
}
}
- 총 2가지 문제가 있었다.
1. 문자열 여러개 입력받기 :
- char array[size] 선언하고 for문 돌려서 scanf로 입력받으면 되겠지?
- 근데 scanf 라인에서 '위치를 기록하는 동안 액세스 위반이 발생했습니다'라는 에러메시지 뜸
- 구글링해보고 scanf 맨 뒤에 sizeof(array)를 넣으니 해결되었다.
2. 입력받은 문자열의 길이 len 계산 :
- strlen함수를 사용하려고 string.h 라이브러리를 선언했는데 오류는 아니지만 경고메시지가 뜸.
- array문자열이 0으로 종료되지 않을 수 있다면서...
- 이건 신기하게도 string.h 라이브러리를 빼버리니 해결되었다. 이유는 모르겠다.
- 하지만 제출시에는 string.h 라이브러리를 넣어주지 않으면 컴파일에러가 난다.
#include <stdio.h>
int main() {
int C;
scanf("%d", &C);
int i, j;
for (i = 0; i < C; i++) {
int numStudent, sumScore = 0, count = 0;
scanf("%d", &numStudent);
int score[1001];
for (j = 0; j < numStudent; j++) {
scanf("%d", &score[j]);
sumScore += score[j];
}
double avgScore;
avgScore = sumScore / numStudent;
for (j = 0; j < numStudent; j++) {
if (score[j] > avgScore) {
count++;
}
}
printf("%.3f%%\n", (double)count/numStudent*100);
}
}
- 문제가 어렵진 않은데 또 data type 때문에 고생했다.
- 문제 내에 테스트 케이스 C는 정수, 학생 수 정수, 점수는 정수라고 다 주어져있고,
- 출력값은 소수점 3자리를 가진 실수로 출력하도록 되어있다.
- 그래서 평균 점수와 출력값을 double로 하니 해결되었다.
'Algorithm in C > 백준 알고리즘' 카테고리의 다른 글
[C] 백준 단계별로 풀어보기 4단계 while문 3문제 (0) | 2021.04.11 |
---|---|
[C] 백준 단계별로 풀어보기 3단계 for문 11문제 (0) | 2021.04.09 |
[C] 백준 단계별로 풀어보기 2단계 if문 5문제 (0) | 2021.04.08 |
[C] 백준 단계별로 풀어보기 1단계 입출력과 사칙연산 11문제 (0) | 2021.04.07 |