Beakjoon_13300번: 방 배정

HKTUOHA·2023년 12월 28일
0

알고리즘 문제

목록 보기
13/15
post-thumbnail

📌문제




📌나의 코드

⚠️첫 번째 시도

def count_rooms(x):
    global answer
    for i in range(1, 7):
        if x[i] > 0:
            q = x[i] // K
            r = x[i] % K
            answer += q
            if r > 0:
                answer += r
    return answer

N, K = map(int, input().split())    # 학생 수, 최대 인원 수
fStudents = [0 for _ in range(7)]  # 학년별 여학생 수
mStudents = [0 for _ in range(7)]  # 학년별 남학생 수

answer = 0

for _ in range(N):
    S, Y = map(int, input().split())
    if S == 0:
        fStudents[Y] += 1
    else:
        mStudents[Y] += 1

count_rooms(fStudents)
count_rooms(mStudents)
print(answer)

🔓풀이

  1. 남학생은 남학생끼리, 여학생은 여학생끼리
    학년별로 방을 나눠야 하므로 1 ~ 7 인덱스를 포함하는 2개의 리스트 생성
  2. 방의 개수는 학년별로 학생 수 // 최다 인원 수와 나머지가 있으면 학생 수 % 최다 인원 수 를 더함
  3. 성별마다 2번을 수행

⚠️두번째 시도

N, K = map(int, input().split())   # 학생 수, 최대 인원 수
students = []
for _ in range(N):
    S, Y = map(int, input().split())
    students.append((S, Y))


sSet = set(students)
sameSY = []

for i in sSet:
    cnt = 0
    for j in range(N):
        if students[j] == i:
            cnt += 1
    sameSY.append(cnt)

# print(sameSY)

answer = 0
for i in range(len(sameSY)):
    answer += ((sameSY[i] // K) + (sameSY[i] % K))

print(answer)

🔓풀이

  1. 성별 상관없이 하나의 리스트로 입력받아 집합을 만듦
  2. 집합에 있는 원소가 리스트에 몇 개 있는지 개수를 세서 같은 성별, 같은 학년 리스트 sameSY에 추가
  3. sameSY 길이만큼 최다 인원 수로 나눈 몫과 나머지를 더함

❌잘못된 점, 오답노트

학생 수를 최다 인원 수로 나눴을 때 몇 명이 남았는지와 상관없이 방은 1개만 추가된다.
학생 수 % 최다 인원 수를 더하는 게 아니라 1 만 더하면 된다.



⭕세 번째 시도 (첫 100점)

N, K = map(int, input().split())        # 학생 수, 최대 인원 수
students = [[0] * 7 for _ in range(3)]  # 행: 성별, 열: 학년

for _ in range(N):
    S, Y = map(int, input().split())
    students[S][Y] += 1

rooms = 0

for i in students:
    for j in i:
        if j % K == 0:
            rooms += j // K
        else:  # 남은 사람이 있으면 방 하나만 더 하면 된다
            rooms += (j // K) + 1

print(rooms)

⭕첫 번째 시도 수정

def count_rooms(x):
    global answer, K
    for i in range(1, 7):
        if x[i] > 0:
            if x[i] % K == 0:
                answer += x[i] // K
            else:
                answer += (x[i] // K) + 1
    return answer

N, K = map(int, input().split())    # 학생 수, 최대 인원 수
fStudents = [0 for _ in range(7)]  # 학년별 여학생 수
mStudents = [0 for _ in range(7)]  # 학년별 남학생 수

answer = 0

for _ in range(N):
    S, Y = map(int, input().split())
    if S == 1:
        mStudents[Y] += 1
    else:
        fStudents[Y] += 1

count_rooms(fStudents)
count_rooms(mStudents)
print(answer)

⭕두 번째 시도 수정

N, K = map(int, input().split())   # 학생 수, 최대 인원 수
students = []
for _ in range(N):
    S, Y = map(int, input().split())
    students.append((S, Y))


sSet = set(students)
sameSY = []

for i in sSet:
    cnt = 0
    for j in range(N):
        if students[j] == i:
            cnt += 1
    sameSY.append(cnt)

# print(sameSY)

answer = 0
for i in range(len(sameSY)):
    answer += (sameSY[i] // K)
    if sameSY[i] % K != 0:
        answer += 1

print(answer)



📌다른 사람 코드

  • 2점
N, K = map(int, input().split())        # 학생 수, 최대 인원 수
students = [[0] * 7 for _ in range(3)]  # 행: 성별, 열: 학년

for _ in range(N):
    S, Y = map(int, input().split())
    students[S][Y] += 1

rooms = 0

for i in students:
    for j in i:
        rooms += ((j // K) + (j % K))

print(rooms)
  • 100점
#학생 수: N, 최대 배정 인원 : k
N , k = map(int, input().split()) 

cnt = [[0,0,0,0,0,0],[0,0,0,0,0,0]]
result = 0
for i in range(N):
    sex , grade  = map(int, input().split())
    cnt[sex][grade - 1] += 1

for i in cnt :
    for j in i:
        if j % k == 0:
            result += j//k
        else:
            result += (j//k) + 1
print(result)



✏️개선점

입력이 2가지 종류로 구분될 때, 2차원 배열을 사용하면 된다.
예를 들어, 위의 문제와 같이 성별과 학년으로만 데이터를 분류하면 될 때는 행: 성별, 열: 학년과 같이 [[0] * 7 for _ in range(3)] 으로 입력 리스트를 구성하면 된다.
혈액형까지 3가지면 [[[0] * 4 for _ in range(7)] for _ in range(3)] ...?

profile
공부 기록

0개의 댓글