C언어 1단계부터 다 풀기로 방학계획 세워두고서는 방학 한달 남기고 시작함...
게으름 사죄
1. 문자열을 정수로 바꾸기
잘못푼 시행착오들..
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
int solution(const char* s) {
int answer = 0;
answer = (int) s;
return answer;
}
걍 받은 값을 int로 형변환 시켰다. 일케해도 될줄..? 왜냐면.. 아스키코드값이랑 똑같다 생각해서 될줄알았느데..
보니까 char* s로 주솟값을 가리키는 포인터가 그런것이 아닐까.. 그래서 결과가 엄청 크게 나온건가보다 하고 그럼 그냥 char에다가 별을 떼버려야겠다고 함
근데 안됨 왜냐면 단일 문자를 받으니..
찾아보니 바꾸는 함수 따로있음
atoi..
그래서 최종코드
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
int solution(const char* s) {
int answer = 0;
answer = (int) s;
return answer;
}
2. 자연수 뒤집어 배열로 만들기
먼저 n길이를 재야함. 처음에 sizeof로 했는데 안됐다.
찾아보니 저건 자료형 크기 측정하는거라 직접 해야되는것 같음
사실 처음에 아무생각없이 len함수썻ㅆ는데 안돼서 찾아보니까 파이썬에만 있는거였다..
그래서 그냥 문자열 재는거 while문 쓰고 for문으로 역출력했다.
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
int* solution(long long n) {
// 리턴할 값은 메모리를 동적 할당해주세요.
long long temp = n;
int length = 0;
while (temp > 0) {
length++;
temp /= 10;
}
int* answer = (int*)malloc(length * sizeof(int));
for (int i = 0; i < length; i++) {
answer[i] = n % 10;
n /= 10;
}
return answer;
}
3. 두 정수 사이에 합
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
long long solution(int a, int b) {
long long answer = 0;
int max = a;
int min = b;
if(a<b){
max = b;
min = a;
}
for(int i = min; i<=max; i++){
answer += i;
}
return answer;
}
이건 그냥 a가 큰지 b가 큰지 확인 한 이후에 min, max 먹이고 for문을 작성했다.
다른풀이 보니 등차수열 공식 이용한것도 있었다
4. 정수 제곱근 판별
일단 주어지는 수가 50000... 어쩌구라 해서 저거 제곱근을 구해보니까
7071067.xxxx
틀린거..
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
long long solution(long long n) {
long long answer = 0;
for (int i=2; i<7071068; i++){
if(i*i == n){
answer = (i+1)*(i+1);
break;
}
else{
answer = -1;
}
}
return answer;
}
그래서 처음에 이렇게 짜니까 테스트는 맞았는데 정답을 제출하니 틀렸었다.
오버플로우때문에.. 그런것 같음
그래서 아래처럼 바꿔봄
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
long long solution(long long n) {
long long answer = 0;
for (long long i=2; i<7071068; i++){
if(i*i == n){
answer = (i+1)*(i+1);
break;
}
else{
answer = -1;
}
}
return answer;
}
근데도 하나가 틀렸다..
와 머가 문젠지 질문게시판 계속 봤는데
n이 1일 때에 대한 케이스가 코드에 없음 2부터 확인하니까..
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
long long solution(long long n) {
if (n == 1) {
return 4;
}
long long answer = 0;
for (long long i=2; i<7071068; i++){
if(i*i == n){
answer = (i+1)*(i+1);
break;
}
else{
answer = -1;
}
}
return answer;
}
이렇게 수정해주었다..
근데 사실 효율은 떨어지는 코드..
sqrt 함수를 사용하면 더 쉽게 풀 수도 있는듯.. 아니면 애초에 for문을 그냥 1부터 돌렸거나..
5. 하샤드 수
답
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
bool solution(int x) {
bool answer = true;
int sum = 0;
int x_ = x;
while(x_ > 0){
sum += x_%10;
x_ /= 10;
}
if(x%sum != 0){
answer = false;
}
return answer;
}
이렇게.. 풀었다. sum에다가 각 자리수를 더하기 위해 변수를 만들고 while문에서 연산한담에 if문에서 하샤드 수 아니면 answer를 false로 바꾼거
'코딩해요 > C' 카테고리의 다른 글
[프로그래머스/C] 1126 코딩테스트 (0) | 2024.11.26 |
---|---|
[백준/C언어] 2475번: 검증수 (0) | 2024.07.09 |
[백준/C언어] 1193번: 분수찾기 (0) | 2024.07.09 |
[백준/C언어] 2292번: 벌집 (0) | 2024.07.09 |
[백준/C언어] 11005번: 진법 변환2 (0) | 2024.07.09 |