<10809번>
처음에 어떻게 풀어야할지 모르다가 알파벳으로 된 배열로 해야하나 하다가 너무 많고 경우도 직접 입력해야 할 것 같아서 고민하다가 아스키코값이 생각이 나서 이것을 기반으로 코드를 짜봤다.
#include <stdio.h>
#include <string.h>
int main(){
char word[100];
int result[26]={0,};
scanf("%s", word);
for(char i='a'; i<='z'; i++) {
int count=0;
for(int k=0; k<strlen(word); k++){
if(i==word[k]) {
count++;
if(count==1){
int index=k;
break;
}
}
if(count==1) result[word[k]-97]=index;
else if(count==0) result[word[k]-97]=-1;
}
}
for(int k=0; k<26; k++) printf("%d ", result[k]);
}
하지만 오류가 나서 다시 작성해본 결과 , 다시 안되었다.
#include <stdio.h>
#include <string.h>
int main(){
char word[100];
int result[26]={0,};
scanf("%s", word);
for(char i='a'; i<='z'; i++) {
for(int k=0; k<strlen(word); k++){
if(i==word[k]) {
result[word[k]-97]=k;
break;
}
else result[word[k]-97]=-1;
}
}
for(int k=0; k<26; k++) printf("%d ", result[k]);
}
count를 버리고 알파벳이 있을때 해당 인덱스를 넣고 아니라면 -1을 넣는다고 했는데 원하는 결과는 안 나오고 아래 결과가 나왔다. 그래서 애초에 다 -1이고 알파벳이 있을 때 값을 변해보는 방향으로 다시 짜본 결과,
#include <stdio.h>
#include <string.h>
int main(){
char word[100];
int result[26]={0,};
scanf("%s", word);
for(int k=0; k<26; k++){
result[k]=-1;
}
for(char i='a'; i<='z'; i++) {
for(int k=0; k<strlen(word); k++){
if(i==word[k]) {
result[word[k]-97]=k;
break;
}
}
}
for(int k=0; k<26; k++) printf("%d ", result[k]);
}
성공을 했고, 코드를 설명해보자면, 먼저 문자열을 받을 배열을 받고 결과를 담을 result 배열을 모두 0으로 초기화하고 -1로 값을 다시 설정해준다. 그리고 소문자 a부터 z까지 문자열의 문자 하나하나와 다 비교해보면서 같다면 해당 문자열에 a의 아스키코드값 97을 빼줘서 a라면 result 인덱스 0인 부분에 a가 나오는 인덱스를 넣어준다. b이면 인덱스 1 자리에 넣어준다. 그리고 포인트는 처음 나온 인덱스를 출력하는 것이므로 같은 알파벳이 나오면 break를 걸어줘 반복을 끝내준다.
<10818번>
#include <stdio.h>
int main(){
int num;
scanf("%d", &num);
int n[100];
for(int k=0;k<num;k++){
scanf("%d",&n[k]);
}
int min=n[0];
int max=n[num-1];
for(int k=0;k<num;k++){
if(n[k]>max) max=n[k];
if(n[k]<min) min=n[k];
}
printf("%d %d", min, max);
}
처음에 런타임 에러(OutOfBounds)라고 떠서 원인을 살펴보니 크기에 문제가 있었다고 해서 int 배열 크기를 100에서 1000000으로 고쳤더니 성공을 받았다.
#include <stdio.h>
int main(){
int num;
scanf("%d", &num);
int n[1000000];
for(int k=0;k<num;k++){
scanf("%d",&n[k]);
}
int min=n[0];
int max=n[num-1];
for(int k=0;k<num;k++){
if(n[k]>max) max=n[k];
if(n[k]<min) min=n[k];
}
printf("%d %d", min, max);
}
숫자 개수인 num을 받고 스캔을 받고나서 크기가 1000000인 정수배열을 선언하고 num개의 수 만큼 스캔을 받는다. 그리고 min과 max의 값을 초기화시켜준다. 처음에 런타임에러 나기전에 min이나 max를 0으로 설정했지만 문제의 수는 음수도 포함이 되었어서 배열 안에 있는 수로 바꿔주었다. (나중에 min, max 모두 n[0]으로 고쳐봤는데 이 경우도 성공이 나왔다. ) 그 다음으로 배열의 수 개수 만큼 min보다 작으면 해당 값을, max보다 크면 해당 값을 min과 max의 값을 바꿔주고 출력해주었다.
<10871번>
#include <stdio.h>
int main(){
int n, std, num;
scanf("%d %d", &n, &std);
for(int k=0; k<n; k++){
scanf("%d", &num);
if(num<std) printf("%d ", num);
}
return 0;
}
숫자의 개수 n, 기준값 std, 입력할 숫자 num을 선언해주었고 n과 std는 직접 입력값을 받고 n번만큼 숫자 num을 입력받고 그 수가 기준값 std보다 작으면 바로 출력하도록 코드를 짰다.
처음에는 정수형 배열을 선언했는데 크기가 정해지지 않고 n에 따라 달라져서 배열 크기를 크게 했다가 에러를 받았고 그래서 for문 한 번 돌때마다 배열 없이 숫자를 입력받고 처리하여 출력하게 하였는데 다행히 원하는 결과가 나왔다.
(많은 수를 처리하고 출력할 때 꼭 배열을 쓸 필요는 없다는 것 명심하자. 다른 방법도 있다.)
'PS 문제풀이' 카테고리의 다른 글
5532번 (0) | 2022.03.04 |
---|---|
백준 11720번, 1085번, 10250번 (공백 없이 스캔, 출력형식) (1) | 2022.02.19 |
1/30~2/2 : 2908번, 2920번, 3052번 (1) | 2022.01.31 |
2742번, 2753번, 2884번 (0) | 2022.01.26 |
2675번, 2739번, 2741번 (0) | 2022.01.20 |