1주차 실강 과제는 백준 문제로 주어졌고, 강의를 듣고 문제를 푸는 것이 아닌 실시간 풀이로 진행되었다.
이런저런 안내사항 공지를 제외하면 체감상 30분 정도 주어졌던 것 같다.

개인적으로는 백준을 이번에 처음 써봤고, 그 안에서 테스트하고 제출하는 과정 자체가 익숙하지 않아 적응이 조금 필요했다.

 

 

오늘의 문제는 줏대 있는 패쪽이 혜빈이,, 그래 너 입고 싶은거 입어라,,ㅋ 암튼 풀이 과정을 기록해보자!

해빈이는 뭘 입고 다니는 걸까

 


2-1. 패션왕 신혜빈 (백준 9375번)

https://www.acmicpc.net/problem/9375

문제 요약

혜빈이는 매일 옷을 다르게 입는다.
옷은 종류별로 분류되어 있고, 같은 조합은 절대 반복하지 않는다.
예를 들어 headgear(모자 종류)에 2개, eyewear(안경 종류)에 1개가 있으면
입을 수 있는 조합은 5가지다. (각 종류마다 안 입는 선택지까지 포함하고, 모든 걸 안 입는 조합 1개는 제외)


 

내 코드 (오답) vs. 팀원 코드 (정답)

❌ 내가 제출했다가 틀린 코드


# 테스트용 입력 데이터를 리스트로 준비
inputs = [
    "2",                         # 테스트 케이스 수: 2개
    "3",                         # 첫 번째 케이스: 옷 개수 3개
    "hat headgear",             # 옷 이름: hat / 종류: headgear
    "sunglasses eyewear",       # 옷 이름: sunglasses / 종류: eyewear
    "turban headgear",          # 옷 이름: turban / 종류: headgear
    "3",                         # 두 번째 케이스: 옷 개수 3개
    "mask face",                # 옷 이름: mask / 종류: face
    "sunglasses face",          # 옷 이름: sunglasses / 종류: face
    "makeup face"               # 옷 이름: makeup / 종류: face
]

# input() 대신 리스트에서 하나씩 꺼내 쓰기 위한 함수 정의
def input():
    return inputs.pop(0)

# 테스트 케이스 개수 입력받기
test_num = int(input())

# 테스트 케이스 수만큼 반복
for _ in range(test_num):
    # 이번 케이스에서의 옷 개수
    clothes_num = int(input())

    # 옷 종류별로 옷 이름을 저장할 딕셔너리
    closet = {}

    # 옷 정보 입력받기
    for _ in range(clothes_num):
        # 공백 기준으로 나눠서 옷 이름과 종류 받기
        name, kind = input().split()

        # 종류가 처음 나오는 거면 빈 리스트 만들어줌
        if kind not in closet:
            closet[kind] = []

        # 해당 종류에 옷 이름 추가
        closet[kind].append(name)

    # 옷을 조합해서 입을 수 있는 경우의 수 계산
    count = 1 # 곱셈을 위해 1로 시작

    # 각 종류마다 (입는 수 + 안 입는 경우 1개) 만큼 선택지 존재
    for kind in closet:
        count *= len(closet[kind]) + 1  # +1: 안 입는 경우 포함

    # 알몸인 조합 제외
    print(count - 1)  

 

✅ 팀원분이 푼 정답 코드 (베스트 답변!)

import sys
input = sys.stdin.readline

T = int(input())           # 테스트 케이스 수
for _ in range(T):         # 테스트 케이스 수 만큼 반복
    N = int(input())       # 한 줄에 들어오는 옷의 개수
    clothes = {}           # 옷 종류별로 개수를 저장할 딕셔너리

    # 옷 종류별로 개수 세기
    for _ in range(N):
        name, kind = input().split()
        if kind in clothes:
            clothes[kind] += 1
        else:
            clothes[kind] = 1

    # 조합 계산부분 (count + 1) 곱하기
    total = 1
    for c in clothes.values():
        total *= (c + 1)

    # 아무것도 안 입는 경우는 제외해서 출력해야함
    print(total - 1)

 


 

 

❌ 내가 놓친 부분

  • 문제 자체의 로직은 맞았지만, 입력을 input()으로 받는 구조가 채점 환경에서 맞지 않아 실패 (연습 중엔 inputs = [...] 배열로 연습함)
  • 옷의 종류별 개수를 리스트로 모아서 len()을 이용했지만, 사실상 숫자만 세서 저장하면 더 간결하고 효율적인 방식이었다

 

✅ 기억할 포인트

  • 백준 같은 저지 사이트는 입력이 많고 빠른 처리를 요구하므로 sys.stdin.readline() 사용을 고려할 것
  • 연습할 때는 리스트로 input() 대체 가능하지만, 제출할 때는 반드시 실제 input()으로 바꿔야 한다!
  • 종류별 옷 개수만 있으면 충분하므로, 리스트에 굳이 옷 이름까지 저장할 필요는 없었다는 점!

 


그 외의 수확: VSCode + CPH (Competitive Programming Helper)

 

 

백준을 처음 써봤는데 중간중간 테스트하면서 결과를 확인하기가 어렵고, 제출해서 결과를 봐야만 한다는 단점이 있었다.
그래서 우선 급한대로 강의에서 알려준 파이참(PyCharm)을 사용하고 있었으나.. 팀원분께서 좋은 도구를 추천해주셨다!
VSCode에 extension으로 Competitive Programming Helper 확장(CPH)을 설치하는 방법인데, 구글링해보니 크롬 익스텐션(competitive companion)이랑 같이 쓰면 더 좋다고 해서 이것도 설치했다.

✅ 백준에서 바로 문제를 보고 + 하면 VSC에서 언어를 선택하고, 아래 이미지와 같이 테스트 케이스 자동 생성, 코드 실행, 입력 자동 넣기를 한 번에 해주는 모습을 볼 수 있다. 무지 편함! 굿굿굿굿 앞으로 애용할 것 같다

 

 

 


느낀 점 (총평)

  • 1일차는 그래도 나름 풀만 했는데, 2일차부터 난이도가 갑자기 실버 급으로 점프해서 당황했다..ㅋ (2일차부터 갑자기 이세계로? 🫨)
  • 예상치 못하게 '입력 형식', '출력 처리', '채점 환경' 차이로 오답 처리가 되는 게 꽤 많았음. (오히려 좀 틀렸다고 생각한 지난 과제가 둘 다 정답이라는 피드백을 받았다. 이번거는 맞았다고 생각했는데 틀렸다고 나왔다. 흠터레스팅! 재밌구만)
  • 하지만 요런 시행착오도 결국 실전 감각을 기르는 데 꼭 필요한 과정이라 생각된다. 이제 슬슬 적응 중이니 앞으로는 더 꼼꼼히 해보는 걸로! 빠샤~🔥