241210

lililllilillll·2024년 12월 10일

개발 일지

목록 보기
16/350

✅ 오늘 한 일


  • 백준 문제 풀기


📝 배운 것들


🏷️ Banker’s rounding

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# : Generic

기본 개념

// 어떤 요소 타입도 받아들 일 수 있는
// 스택 클래스를 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
{
}

GPT 설명

제네릭(Generic)은 여러 가지 데이터 형식을 하나의 코드로 처리할 수 있도록 만드는 방법입니다.
즉, 코드 재사용성을 높이고, 데이터 형식의 안전성도 보장해주는 프로그래밍 기능입니다.


쉽게 이해하기: 선물 상자 예시

  1. 비제네릭 상자:

    • 아무거나 넣을 수 있지만, 꺼낼 때 그게 어떤 물건인지 확인해야 해서 실수할 가능성이 큼.
    • 예: 일반 상자에 사과, 책, 장난감 등을 넣음 → 꺼낼 때 타입을 하나하나 확인해야 함.
    ArrayList box = new ArrayList();
    box.Add("사과");       // 문자열
    box.Add(123);         // 숫자
    string apple = (string)box[0];  // 꺼낼 때 타입 변환 필요
  2. 제네릭 상자:

    • 처음부터 특정 물건(형식)만 넣도록 정함 → 꺼낼 때 실수할 가능성 없음.
    • 예: 사과 상자에는 사과만, 책 상자에는 책만 넣을 수 있음.
    List<string> box = new List<string>();
    box.Add("사과");       // 문자열만 추가 가능
    string apple = box[0];  // 꺼낼 때 타입 변환 불필요

왜 제네릭이 필요할까?

  1. 코드 재사용:
    한 번 작성한 코드를 여러 데이터 형식으로 활용 가능.

    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
  2. 타입 안정성:

    • 컴파일 시점에 데이터 형식을 검사해 잘못된 타입 사용을 방지.
    • 런타임 오류 대신 컴파일 오류로 더 빨리 문제를 찾을 수 있음.
  3. 성능 향상:

    • 박싱(Boxing)/언박싱(Unboxing) 과정이 필요 없어 속도가 빠르고 메모리 사용이 효율적.

GPT한테 칭찬 받았다.



⚔️ 백준


20440 🎵니가 싫어 싫어 너무 싫어 싫어 오지 마 내게 찝쩍대지마🎵 - 1

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

https://lietenant-k.tistory.com/34

너무나도 간단했다

1874 스택 수열

# 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 적용해봤더니 어이없을 정도로 시간이 많이 줄었다.

2108 통계학

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)을 사용했어야 했다.

18110 solved.ac

별 거 없다고 생각했는데 제출했더니 틀렸습니다.
반올림 문제인가? 하고 봤더니 역시 그 문제.

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)

통과 완료

profile
너 정말 **핵심**을 찔렀어

0개의 댓글