[BOJ] 10809/10773
#10809: 알파벳 찾기
[문제]
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.
[코드]
#include<stdio.h>
int main()
{
char word[101];
char* wp = &word;
int check[26];
for (int i = 0; i < 26; i++)
check[i] = -1;
scanf("%s", &word);
for (int i = 0; *wp != '\0'; wp++, i++)
{
if (check[*wp - 'a'] != -1)
continue;
check[*wp - 'a'] = i;
}
for (int i = 0; i < 26; i++)
printf("%d ", check[i]);
printf("\n");
return 0;
}
[코드설명]
단어 S를 저장할 변수 word를 만들고, 포인터 변수 wp에 word의 메모리 주소를 저장한다. 알파벳 a-z가 단어의 몇번째 자리에 위치하는지 체크할 수 있도록 정수형 배열 check를 만들었다.
check의 값을 모두 -1로 바꿔줬고, 입력한 단어가 word에 저장되고 나서 for문으로 wp의 값을 증가시키면서 check배열의 값을 변경했다.
단어 S의 위치를 나타내는 i를 0으로 초기화시키고, *wp-'a'의 값에 해당하는 check배열 인덱스에 i의 값을 대입시켰다. *wp-'a'는 단어 S의 i인덱스에 위치하는 알파벳에 해당하는 check배열의 인덱스다. check[*wp-'a'] = i;를 실행하고 나면 wp와 i를 증가시키고 *wp의 값이 NULL 문자가 아닌지 확인한다.
단어 S에서 처음 나타나는 알파벳의 위치만 확인해야 하므로 앞에서 한 번 나온 알파벳이 등장하면 건너뛸 수 있도록 if(check[*wp-'a'] != -1) countinue; 해당 코드를 넣어줬다. check[*wp-'a']의 값이 -1이 아니라면 앞에서 이미 등장한 알파벳이라는 뜻이므로 continue로 다음 코드를 건너뛰게 한다.
단어 S를 다 검사했으면 for문으로 check배열의 값을 모두 출력한다.
[채점 결과]
#10773: 제로
[문제]
나코더 기장 재민이는 동아리 회식을 준비하기 위해서 장부를 관리하는 중이다.
재현이는 재민이를 도와서 돈을 관리하는 중인데, 애석하게도 항상 정신없는 재현이는 돈을 실수로 잘못 부르는 사고를 치기 일쑤였다.
재현이는 잘못된 수를 부를 때마다 0을 외쳐서, 가장 최근에 재민이가 쓴 수를 지우게 시킨다.
재민이는 이렇게 모든 수를 받아 적은 후 그 수의 합을 알고 싶어 한다. 재민이를 도와주자!
[코드]
#include<stdio.h>
int stack[100000];
int sp;
void pop();
void push(int n);
int main()
{
int num = 0, k = 0;
int i, sum = 0;
scanf("%d", &k);
for (; k > 0; k--)
{
scanf("%d", &num);
if (num == 0)
pop();
else
push(num);
}
i = sp - 1;
while (i >= 0)
{
sum += stack[i];
i--;
}
printf("%d\n", sum);
return 0;
}
void pop()
{
stack[--sp] = 0;
}
void push(int n)
{
stack[sp++] = n;
}
[코드설명]
num은 입력 받은 정수, k는 정수를 입력할 수 있는 횟수다. for문으로 k번 만큼 num을 입력 받고, 매 반복마다 num이 0이면 stack의 최상위 값을 삭제, 0이 아니면 추가할 수 있게 했다.
num의 입력이 끝나면 sp-1을 i에 대입해서 stack의 합을 구할 때 쓸 인덱스로 활용할 것이다. while문으로 i가 0보다 크거나 같을 때까지 sum에 stack[i]의 값을 더하고 i를 1씩 감소시켰다.
while문이 끝나면 sum을 출력한다.
[채점 결과]
처음에 언어를 잘못 설정해서 틀렸습니다....ㅎ