https://www.freeism.co.kr/wp/archives/1792
가장 가까운 짝수로 반올림하는 것
1.5 is rounded to 2
2.5 is rounded to 2
3.5 is rounded to 4
4.5 is rounded to 4
// 어떤 요소 타입도 받아들 일 수 있는
// 스택 클래스를 C# 제네릭을 이용하여 정의
class MyStack<T>
{
T[] _elements;
int pos = 0;
public MyStack()
{
_elements = new T[100];
}
public void Push(T element)
{
_elements[++pos] = element;
}
public T Pop()
{
return _elements[pos--];
}
}
https://www.csharpstudy.com/csharp/CSharp-generics.aspx
<T>의 T 자리에 들어간 자료형이 클래스 안에 있는 모든 T에 적용된다.
// T는 Value 타입
class MyClass<T> where T : struct
// T는 Reference 타입
class MyClass<T> where T : class
// T는 디폴트 생성자를 가져야 함
class MyClass<T> where T : new()
// T는 MyBase의 파생클래스이어야 함
class MyClass<T> where T : MyBase
// T는 IComparable 인터페이스를 가져야 함
class MyClass<T> where T : IComparable
// 좀 더 복잡한 제약들
class EmployeeList<T> where T : Employee,
IEmployee, IComparable<T>, new()
{
}
// 복수 타입 파라미터 제약
class MyClass<T, U>
where T : class
where U : struct
{
}
제네릭(Generic)은 여러 가지 데이터 형식을 하나의 코드로 처리할 수 있도록 만드는 방법입니다.
즉, 코드 재사용성을 높이고, 데이터 형식의 안전성도 보장해주는 프로그래밍 기능입니다.
비제네릭 상자:
ArrayList box = new ArrayList();
box.Add("사과"); // 문자열
box.Add(123); // 숫자
string apple = (string)box[0]; // 꺼낼 때 타입 변환 필요
제네릭 상자:
List<string> box = new List<string>();
box.Add("사과"); // 문자열만 추가 가능
string apple = box[0]; // 꺼낼 때 타입 변환 불필요
코드 재사용:
한 번 작성한 코드를 여러 데이터 형식으로 활용 가능.
public T Add<T>(T a, T b)
{
dynamic x = a;
dynamic y = b;
return x + y;
}
Console.WriteLine(Add(1, 2)); // int
Console.WriteLine(Add(1.5, 2.5)); // double
Console.WriteLine(Add("안녕", "하세요")); // string
타입 안정성:
성능 향상:

GPT한테 칭찬 받았다.

한참동안 헤매다가 답을 봤더니

https://lietenant-k.tistory.com/34
너무나도 간단했다
# 1부터 차례대로 스택에 넣다가 수열에 해당하는 수가 나오면 뽑기
# 숫자 다 털어냈는데 더 이상 뽑을 수 없으면 x
n=int(input())
seq=[int(input()) for _ in range(n)]
idx=0
stack=[]
result=[]
for i in range(1,n+1):
result.append('+')
stack.append(i)
while(stack and seq[idx]==stack[-1]):
result.append('-')
idx+=1
stack.pop()
if(stack):
print('NO')
else:
for r in result:
print(r)
내가 푼 거.
다른 사람이 푼 거랑 20배 가까이 차이 나길래 왜 그러지 하고 일단 sys.stdin.readline 적용해봤더니 어이없을 정도로 시간이 많이 줄었다.
import sys
input = sys.stdin.readline
N=int(input())
L=[int(input()) for _ in range(N)]
L.sort()
print(round(sum(L)/N))
print(L[N//2])
# 새로운 숫자 만나면 num, count 초기화
# 같은 숫자 만나면 count 올리면서 max_count랑 비교하다가
# max_count랑 같아지면 배열에 해당 숫자 추가하고, 더 커지면 배열 지우고 해당 숫자만 남김
num, count = None, 0
max_count, max_count_nums = 0, []
for i in range(N):
# 숫자가 이전과 같은지 다른지
if L[i] != num:
num = L[i]
count = 1
else:
count += 1
# count가 최대인지 아닌지
if count == max_count:
max_count_nums.append(num)
elif count > max_count:
max_count = count
max_count_nums = [num]
if len(max_count_nums) > 1:
print(max_count_nums[1])
else:
print(max_count_nums[0])
print(L[-1]-L[0])
의외로 살짝 오래 걸렸다. 구현할 거 주석으로 적어놓으니까 그제서야 바로 풀림.
sum(L)//N이 아니라 round(sum(L)/N)을 사용했어야 했다.
별 거 없다고 생각했는데 제출했더니 틀렸습니다.
반올림 문제인가? 하고 봤더니 역시 그 문제.
https://sjkoding.tistory.com/55

문제의식도 똑같고 시도해봤던 테케까지 똑같은 포스트를 보고 힌트를 얻어
import sys, math
input = sys.stdin.readline
n = int(input())
L = [int(input()) for _ in range(n)]
L.sort()
diff = 0
if n!=0:
trim = math.floor(n*0.15+0.5)
for i in range(trim,n-trim):
diff += L[i]
# diff = round(diff/(n-trim*2))
diff = math.floor(diff/(n-trim*2)+0.5)
print(diff)
통과 완료