본문 바로가기
PS 문제풀이

7주차 백준

by 희디 2022. 2. 13.

 

<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의 값을 바꿔주고 출력해주었다. 

 

채점 시간이 평소보다 길었지만, PASS를 받았다.

<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