✅ 백준 | 10819 차이를 최대로,
✅ C 연습 : 백준 | 9086, 27323, 28691, 3003, 30214, 13136, 2525
☑️ CS:APP | 3장 안 읽은 부분 마저 읽기, CSAPP 저자 직강 유튜브 보기
printf("%c\n", isS ? 'S' : 'F');
더 간결하게 짤 수 있다.
자료형 | 크기(바이트) | 최소값 | 최대값 |
---|---|---|---|
char | 1 | -128 | 127 |
unsigned char | 1 | 0 | 255 |
short | 2 | -32,768 | 32,767 |
unsigned short | 2 | 0 | 65,535 |
int | 4 | -2,147,483,648 | 2,147,483,647 |
unsigned int | 4 | 0 | 4,294,967,295 |
long | 4 또는 8 | -2,147,483,648 또는 -9,223,372,036,854,775,808 | 2,147,483,647 또는 9,223,372,036,854,775,807 |
unsigned long | 4 또는 8 | 0 | 4,294,967,295 또는 18,446,744,073,709,551,615 |
long long | 8 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
unsigned long long | 8 | 0 | 18,446,744,073,709,551,615 |
import sys
input = sys.stdin.readline
from collections import deque
N = int(input())
A = list(map(int, input().split()))
B = []
R_max = 0
print(A)
cnt = 0
def arrMax(A,B):
global R_max
global cnt
if len(B) == N:
R = 0
cnt += 1
for i in range(N-1):
R += abs(B[i]-B[i+1])
R_max = max(R,R_max)
return
for j in range(len(A)):
B.append(A[j])
temp = A[j]
del A[j]
arrMax(A,B)
A.insert(j,temp)
arrMax(A,B)
print(cnt)
print(R_max)
처음엔 그리디 느낌으로 sort해놓은 리스트에서
최댓값과 최솟값의 차이의 절대값을 계속 더해봤는데 62가 안 나옴.
생각해보니 최댓값이나 최솟값을 먼저 사용해버리면
2번 사용 못하고 1번밖에 사용을 하는거니까 결과가 최대가 나올 수가 없음.
N도 작은 걸 보니까 완전탐색이구나! 하고 순열들 경우의 수를 구해보려고 함.
백트래킹으로 해봤는데 경우의 수 딱 하나만 확인하고 종료해버림.
import sys
input = sys.stdin.readline
N = int(input())
A = list(map(int, input().split()))
R_max = 0
cnt = 0
def arrMax(A, B):#include <stdio.h>
int main() {
long long H, W, N, H_need, W_need, R;
scanf("%d %d %d", &H, &W, &N);
H_need = H%N == 0 ? H/N : H/N + 1;
W_need = W%N == 0 ? W/N : W/N + 1;
printf("%lld",H_need*W_need);
}
global R_max
if len(B) == N:
R = 0
for i in range(N - 1):
R += abs(B[i] - B[i + 1])
R_max = max(R, R_max)
return
for j in range(len(A)):
B.append(A[j])
arrMax(A[:j] + A[j+1:], B)
B.pop()
arrMax(A, [])
print(R_max)
gpt한테 고쳐달라고 해봤더니 잘 돌아가는 코드를 줬다.
의외로 로직은 거의 다 제대로 짰었다.
A는 원본은 그대로 두고 B에 넣어진 부분만 빼고 다음 재귀에 넣으면 훨씬 빨랐고,
B도 넣기만 하는게 아니라 pop을 해줘야 백트래킹이 정상적으로 이루어지는 거였다.
로직 설명
1. A의 원소들로 순열을 만들었을 때 모든 경우의 수를 구해야 함
2. 재귀를 사용함. 매개변수 A는 아직 안 넣은 숫자들, B는 지금 넣은 숫자들임
3. 1개 선택했을 때는 1개만 선택한 경우의 수들만 다음 재귀로 보내줘야 하므로 B 백트래킹.
import sys
from itertools import permutations
#(1) 순열만들기
input = sys.stdin.readline
n = int(input())
arr = list(map(int, input().split()))
p = list(permutations(arr, n))
answer = 0
for i in p:
s = 0
# (2) 반복문으로 튜플을 꺼내 각 순열마다 차이의 합(s)을 구하고, 최대값을 answer에 저장한다
for j in range(n-1):
s += abs(i[j] - i[j+1])
# 모든 경우 원소들끼리의 차이의 절댓값의 합을 max함수를 이용하여 갱신
answer = max(answer, s)
print(answer)
파이썬 순열 라이브러리를 이용하는 방법도 있었다
#include <stdio.h>
#include <string.h>
int main() {
int T;
scanf("%d", &T);
for (int i = 0; i < T; i++){
char str[1000];
scanf("%s", str);
printf("%c%c\n", str[0], str[strlen(str)-1]);
}
}
c언어 어렵다
#include <stdio.h>
#include <string.h>
int main() {
int n;
char s[101];
scanf("%d", &n);
while(n--) {
scanf("%s", s);
printf("%c%c \n", s[0], s[strlen(s) - 1]);
}
return 0;
}
while문을 이용하는 방법도 cool한듯
#include <stdio.h>
#include <stdbool.h>
int main() {
int arr[8];
for (int i = 0; i < 8; i++)
scanf("%d", &arr[i]);
bool isS = true;
for (int i = 0; i < 8; i++){
if(arr[i]==9){
isS = false;
break;
}
}
if(isS){
printf("S");
} else {
printf("F");
}
}
받고 바로 판별하면 되는데 뭐한건지 모르겠다
#include <stdio.h>
int main() {
int arr[8];
int isS = 1; // 1은 true, 0은 false
for (int i = 0; i < 8; i++) {
scanf("%d", &arr[i]);
if (arr[i] == 9) {
isS = 0;
}
}
printf("%c\n", isS ? 'S' : 'F');
return 0;
}
gpt가 간결하게 만들어준 코드
#include <stdio.h>
int main() {
int H, W, N, H_need, W_need, R;
scanf("%d", &H);
scanf("%d", &W);
scanf("%d", &N);
H_need = H%N == 0 ? H/N : H/N + 1;
W_need = W%N == 0 ? W/N : W/N + 1;
printf("%d",H_need*W_need);
}
이걸로 아무리 해도 안되길래 로직을 계속 점검했는데 전혀 틀린 부분이 없음.
답답해서 답지를 봤더니 자료형을 long long으로 해줘야 했음.
#include <stdio.h>
int main() {
long long H, W, N, H_need, W_need, R;
scanf("%d %d %d", &H, &W, &N);
H_need = H%N == 0 ? H/N : H/N + 1;
W_need = W%N == 0 ? W/N : W/N + 1;
printf("%lld",H_need*W_need);
}
자료형도 꼼꼼히 봐야할듯