Skip to content

Conversation

@zaqquum
Copy link
Collaborator

@zaqquum zaqquum commented Jul 12, 2025

🌱WIL

이번 한 주의 소감을 작성해주세요!

  • 이번 주는 오랜만에 스킬체크 문제를 진행하였다. 나름 이번 달에 lv2 는 통과 할 수 있을 것이라고 생각했는데 이번에도 통과하지 못해서 너무 아쉬웠다. 평소 그래프 문제 위주로 풀어서 그런지 이번에 등장한 해쉬와 정렬 파트 문제는 어떻게 접근해야 할지 감을 못 잡고 있었다. 이후 오답을 할때 결국 다른 사람 풀이를 참고했는데 약 5줄로 끝나는 문제를 2시간 넘게 붙잡고 있었던게 허탈했다. 다음 주 부터는 초심으로 돌아가 자료구조 및 구현 문제 위주로 다시 달리겠다.

🚀주간 목표 문제 수: 4개

푼 문제


백준 #11723. 집합: 구현, 비트마스킹/ 실버5

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?
6가지의 opeation을 변수 x 의 입력 여부에 따라 2가지로 나눠서 기능을 구현한다.

  1. 집합 S 초기화 및 입력 명령어 개수 M 변수에 정의하기
    • 배열 S 을 아래와 같이 0 으로 초기화한다 (1≤x≤20 란 원소의 크기 제한 존재함)

      i = 집합 원소 0 1 2 3 4 18 19 20
      value = 원소 존재 여부
      • 0 = 없음 / 1 있음 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
  2. all , empty 명령어
    1. all : 집합 S의 모든 값을 1로 초기화
    2. empty : 집합 S 의 모든 값을 0 으로 초기화
  3. add , remove , toggle , check
    1. add : |연산을 활용하여 s[x]=1 로 설정하기
    2. remove : &연산 을 활용해서 s[x] = 0 설정하기
    3. toggle : NOR 연산 을 활용해 있으면 0 없으면 1 로 설정하기
    4. check : 현재 집합 S 에서 s[x] 의 값을 출력하기

🚩제출한 코드

import sys
input = sys.stdin.readline
answer = []
M = int(input())
s = [ 0 for _ in range(21)] # 1<=x <=20 숫자 제한 존재함
for _ in range(M) :
    operations = list(input().split())
    # 1. check , all 
    if len(operations) <2 : 
        if operations[0] == "all" :
            s = [1 for _ in range(21)]
        elif operations[0] == "empty" :
            s = [0 for _ in range(21)]
    # 2. add, remove , check , toggle
    else :
        ops , x = operations
        if ops == "add" :
            s[int(x)] = s[int(x)] | 1 
        elif ops == "remove" :
            s[int(x)] = s[int(x)] & 0 
        elif ops == "check" :
            print(s[int(x)])
            #answer.append(s[int(x)])
        elif ops == "toggle" : # NAND - 같으면 0 , 다르면 1
            s[int(x)] = s[int(x)]^1
    
#3. 결과 출력
#for a in answer:
#    print(a)

💡TIL

배운 점이 있다면 입력해주세요

프로그래머스 #42746. 가장 큰수: 정렬/ lv2

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

  1. 입력 numbers 리스트의 원소를 문자열로 형식 변경하기

  2. 해당 원소들을 길이를 맞춰 비교한다

    • key = lambda x : x*2

      → 이 경우 numbers의 원소들은 0≤num≤1,000 제한이 있기 때문에, 숫자의 자리수를 맞춰서 비교하기 위해 *3을 수행한다

  3. 출력 형태 맞추기

    • answer = "".join(numbers) 가 아닌 answer = str(int("".join(numbers)))
      을 사용함
    • 반례 : [0,0,0] → “0” 임

🚩제출한 코드

def solution(numbers):
    # 1. number의 같은 길이에 대해서 크기 비교하기
    numbers_str = [str(num) for num in numbers ] # 문자열로 변환
    numbers = sorted(numbers_str ,key = lambda x: x*3 , reverse = True )
    #2. 리스트 원소를 1개의 문자열로 출력 형식 충족하기
    # answer = "".join(numbers)
    # print(answer , type(answer))
    answer = str(int("".join(numbers)))
    # print(answer , type(answer))
    return answer

💡TIL

배운 점이 있다면 입력해주세요

프로그래머스 #42577. 전화번호 목록 : 구현, 해쉬/ lv2

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

  1. 글자수로 정렬하기

  2. key = phone_number 요소 인 해쉬맵 생성하기

    value = 1

  3. 반복문으로 phone num 탐색하면서 앞의 한 글자씩 hashmap의 key임을 확인함

🚩제출한 코드

def solution(phone_book):
    answer = True
    #1. 글자수로 정렬하기
    phone_book = sorted(phone_book , key = lambda x : (len(x)))
    #2. key = 전번인 해쉬맵 생성
    hash_map = {}
    for phone in phone_book : 
        hash_map[phone] = 1
    #3. hashmap에 접두어 비교하기
    for phone in phone_book : 
        tmp = ""
        # 접두어 한 글자씩 추가해서 hasp_map의 key들 중에 같은게 있는지 확인
        for n in phone : 
            tmp += n
            if tmp in hash_map and tmp!= phone : 
                answer = False
    return answer

💡TIL

배운 점이 있다면 입력해주세요

  • 해시란
    • Hash_func(key) = Value 로 값을 찾는 자료 구조를 의미한다.
    • 특징
      1. 단방향 (값을 통해 키를 탐색 할 수 없음)
      2. 값 검색에 시간 복잡도 O(1) 걸림
      3. value 을 인덱스로 활용하기 위해선 변환 과정 필요

프로그래머스 #12953. N개의 최소공배수: 구현/ lv2

정리한 링크: (바로가기)

🚩플로우 (선택)

코드를 풀이할 때 적었던 플로우가 있나요?

  1. 반복문으로 최소공배수의 구성 원소 (elements찾기
  • 구성 원소 e가 100을 넘을 때 또는 배열 arr의 모든 숫자가 1로 될 때 까지
  1. 해당 e 로 배열 arr 가 나누어 떨어지는 지 확인

    -> 떨어지면 flag = True , 해당 arr[k] 은 e의 몫(arr[k] = arr[k] /e) 으로 구성함

  2. 해당 e 값이 배열 arr 의 값 중 하나 이상의 구성 요소일때 , 최소공배수 구성워소 elements 배열에 추가

  3. 해당 값이 구성 원소 아닐 경우 -> 다음 e 로 다시 도전하기

🚩제출한 코드

def solution(arr) :
    answer = 1
    elements = []
    
    e = 2 
    # 1. 
    while e<=100 or arr.count(1) != len(arr) : 
        
        flag = False 
        #2. 해당 e 로 배열 arr 가 나누어 떨어지는 지 확인 -> 떨어지면 flag = True , 해당 arr[k] 은 e의 몫으로 구성함
        for k in range(len(arr)) :
            if arr[k] == 1 : 
                continue 
            if arr[k] % e == 0 : 
                arr[k] =arr[k] // e 
                flag = True 
        #3. 해당 e 값이 배열 arr 의 값 중 하나 이상의 구성 요소일때 , 최소공배수 구성워소 elements 배열에 추가 
        if flag : 
            elements.append(e)
        else : # 해당 값이 구성 원소 아닐 경우 -> 다음 e 로 다시 도전하기
            e+= 1
                
    
    for e in elements :
        answer*= e 
    return answer

@zaqquum zaqquum self-assigned this Jul 12, 2025
@zaqquum zaqquum changed the title Hongjoo/ 7월 2째주 / 4문제 Hongjoo/ 7월 2주차 / 4문제 Jul 12, 2025
Copy link
Collaborator

@Mingguriguri Mingguriguri left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이번 주는 구현 문제 위주로 푸셨네요!! 저도 공감하는 부분이,,, 정렬을 lambda를 이용해서 해야 할 대 항상 까먹더라구요.
그리고 비트마스킹 문제 좋은 것 같네요!! 저도 한 번 풀어봐야겠어요!
첫 번째랑 두 번째 문제는 스킬체크에 나왔던 문제였나요? 고생하셨습니다!

P.S. PR 내용 중에 제가 문제 유형 부분은 조금 순서를 바꿔놨어요! 자동화로 집계될 때 집계가 안 될 수도 있어서요!

Copy link
Member

@YoonYn9915 YoonYn9915 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다, 진짜 좀 많이 풀어봐서 알거 같다고 생각한 유형도 두 세달 안보면 다 까먹게 되더라구요 ㅜㅜ 바쁜 와중에도 한 주에 4문제 풀고 정리하신거 대단하다고 생각합니다! 다음 한 주도 또 열심히 해봐요

@zaqquum zaqquum closed this Jul 14, 2025
@zaqquum zaqquum deleted the hongjoo branch July 14, 2025 10:51
@zaqquum zaqquum restored the hongjoo branch July 14, 2025 10:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants