private function makeArrDateData ($dateVal, $interval, $makeKey, $time) {

        $i = 0;
        if ($interval == "month") {
            while ($i < $dateVal) {

                $dateTime = date("Ym",strtotime("-".$i." ".$interval, strtotime($time)));
                $dataArrSum[$i][$makeKey] = $dateTime;
                $i += 1;
            }
        } else {
            while ($i < $dateVal) {

                $dateTime = date("Ymd",strtotime("-".$i." ".$interval, strtotime($time)));
                $dataArrSum[$i][$makeKey] = $dateTime;
                $i += 1;
            }
        }

        return $dataArrSum;
    }
 
 

개발스토리

날짜를 기준으로 뿌려줘야하는데 데이터를 들고와보니 데이터가 날짜별로 모두 채워져있다면 좋았겠지만 데이터가 들쭉날쭉했다 여러테이블에서 가져오다보니 쿼리문도 여러개가 나가서 여러개의 데이터를 합쳐야하는 상황이었다 그나마 데이터가 잘 들어간 데이터를 기준으로 합치려고 시도했지만 만약 이데이터중 하나라도 빠져있는데 다른 데이터는 데이터가 있다면 해당날짜의 데이터가 누락되는 대참사가 벌어진다.. 

결국 열심히 쓴 코드는 과감하게 버리고 날짜가 온전히 다들어간 연관배열이 필요했다.

해당 함수는 원하는 길이만큼 $dateVal에 int형을 주고

$interval 에 날짜간의 간격을 지정해주면된다 일일데이터의 경우 day를 주간의 경우 week를

$makeKey 에 지정하고싶은 연관배열의 이름을 주면된다 

$time에는 처음 시작할 날짜형식을 주면된다 나는 날짜형식을 20200510으로 주었다

일간

(특정기간의 데이터를 들고오고 싶다면 LIMIT이 아니라 where절에서 기간을 조절해야한다)

SELECT 

DATE_FORMAT(your_date, '%Y%m%d') AS '날짜', 

 

FROM `YOURTABLE

WHERE `your_date` >= '일주일전날짜(20220503)' and `your_date` <= '오늘 날짜(20220510)'

GROUP BY DATE_FORMAT(your_date, '%Y%m%d') ORDER BY `날짜` DESC

 

 

주간

(내가 인식하는 1주일은 월요일에서 시작해서 일요일에 끝이난다고 생각해서 이렇게 만들었다)

SELECT 

DATE_FORMAT(DATE_SUB(your_date, INTERVAL (DAYOFWEEK(your_date)-2) DAY), '%Y%m%d') AS '시작날짜', 

DATE_FORMAT(DATE_SUB(your_date, INTERVAL (DAYOFWEEK(your_date)-8) DAY), '%Y%m%d') AS '끝날짜', 

 

FROM `YOURTABLE` 

GROUP BY `시작날짜`, `끝날짜` 

ORDER BY `시작날짜` DESC LIMIT 4

 

 

월간

(월간데이터는 where 절로 처리하지 않은 이유는 일간데이터처럼 데이터가 비어있는 경우가 없다 시피해서 select에서 처리했다 월간데이터도 비어있는 경우가 있다면 WHERE 절에서 처리하는것이 맞다)

SELECT 

DATE_FORMAT(your_date, '%Y%m') AS `날짜`, 

 

FROM `YOURTABLE`

GROUP BY DATE_FORMAT(your_date, '%Y%m')

ORDER BY `날짜` DESC LIMIT 12

 

 

# 주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다.
# 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때,
# nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때
# 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.


def solution(nums):
    answer = 0

    i1 = 0
    i2 = 0

    loofVal = 0
    loofValFin = len(nums)-2
    loofValLen = len(nums)-1

    while loofVal < loofValFin:
        i1 = loofVal+1

        while i1 <= loofValFin:
            i2 = i1+1

            while i2 <= loofValLen:
                sumval = nums[loofVal]+nums[i1]+nums[i2]
                i=2
                isPrime = 0

                while i*i <= sumval :
                    if sumval%i == 0:
                        isPrime = 1
                    i += 1

                if isPrime == 0:
                    answer += 1

                i2 += 1
            i1 += 1
        loofVal += 1

    return answer

개발스토리

소수를 만드는 경우의 수를 모두 구현하지 않고 효율적으로 하는 방법을 생각해보느라 기간이 좀 더 걸렸다

결론은 그런 방법은 없다로 결론이 났다 이 판단은 나중에 다시보면 얼마든지 바뀔수있을거같다

모든 경우의 수를 만드니까 로직은 간단하다

1번째 선택 반복문

2번째 선택 반복문

3번째 선택 반복문

이 선택이 겹치지 않게하기위해서는 루프를 돌기전에 부모의 루프 값을 받아와서 ++를 진행한다

문제 요약

인형의 정보가 담긴 2차 배열을 받고 [[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]]

어떤 인덱스를 꺼낼지 적힌 매개변수를 받는데 [1,5,3,5,1,2,1,4]

꺼내서 담긴 바구니에 같은 인형의 정보가 두개가 쌓이면 두개를 터트려서 사라진다

다 꺼내고 남은 인형의 수를 return하도록 만들어보자

 
def solution(board, moves):
    arr = []
    answer = 0
    leng = len(board)

    for move in moves:
        i = 0
        while True:
            if i == leng:
                break
            if board[i][move-1] != 0:
                if len(arr) != 0:
                    if board[i][move-1] == arr[-1]:
                        arr.pop()
                        answer = answer+2
                    else:
                        arr.append(board[i][move-1])
                else:
                    arr.append(board[i][move-1])
                board[i][move-1] = 0
                break
            i = i+1

    return answer

 


개발스토리

처음문제를 보고 이해를 잘못했다 0번째 배열이 1번줄이 되는 방식으로 오해했다. 그러다가 다시 문제를 보고 0번째가 가장위의 줄을 나타내고 1번째 배열이 위에서 2번째줄을 나타내는 로직이었다

로직을 생각할때 크래인의 동작을 잘생각해보았다

1. 인형을 뽑을때 크래인은 비어있는 인형이 나오지 않을때까지 쭉 내려간다

2. 인형을 발견하면 인형을 꺼낸다 

3. 꺼내진 자리는 비어있음으로 표시를 바꾼다

 

이런 로직을 기반으로 코드를 구성했다 그래서 move의 수를 받아 i를 증가시키며 쭉 내려가면서 탐색하도록 했다

 

# 맨 처음 왼손 엄지손가락은 * 키패드에 오른손 엄지손가락은 # 키패드 위치에서 시작하며, 엄지손가락을 사용하는 규칙은 다음과 같습니다.

    # 1. 엄지손가락은 상하좌우 4가지 방향으로만 이동할 수 있으며 키패드 이동 한 칸은 거리로 1에 해당합니다.
    # 2. 왼쪽 열의 3개의 숫자 1, 4, 7을 입력할 때는 왼손 엄지손가락을 사용합니다.
    # 3. 오른쪽 열의 3개의 숫자 3, 6, 9를 입력할 때는 오른손 엄지손가락을 사용합니다.
    # 4. 가운데 열의 4개의 숫자 2, 5, 8, 0을 입력할 때는 두 엄지손가락의 현재 키패드의 위치에서 더 가까운 엄지손가락을 사용합니다.
        # 4-1. 만약 두 엄지손가락의 거리가 같다면, 오른손잡이는 오른손 엄지손가락, 왼손잡이는 왼손 엄지손가락을 사용합니다.
# 순서대로 누를 번호가 담긴 배열 numbers, 왼손잡이인지 오른손잡이인 지를 나타내는 문자열 hand가 매개변수로 주어질 때, 각 번호를 누른 엄지손가락이 왼손인 지 오른손인 지를 나타내는 연속된 문자열 형태로 return 하도록 solution 함수를 완성해주세요.

n = [0,1,2,3,4,5,6,7,8,9]
n.insert(1,[["2"],["1","3","5"],["4","6","8"],["7","9","0"],["*","#"]])
n.insert(4,[["5"],["2","4","6","8"],["1","3","7","9","0"],["*","#"]])
n.insert(7,[["8"],["5","7","0","9"],["4","2","6","*","#"],["1","3"]])
n.insert(0,[["0"],["8","*","#"],["7","9","5"],["4","2","6"],["1","3"]])

def solution(numbers, hand):
    answer = ''
    Lpo = "*"
    Rpo = "#"
    LpoCoun = 10
    RpoCoun = 10

    for i in numbers:

        if i == 1 or i == 4 or i == 7:
            answer = answer+"L"
            Lpo = str(i)
        if i == 3 or i == 6 or i == 9:
            answer = answer+"R"
            Rpo = str(i)

        if i == 2 or i == 5 or i == 8 or i == 0:

            # 거리 받아오기
            count = 0
            for j in n[i]:
                if Lpo in j:
                    LpoCoun = count
                if Rpo in j:
                    RpoCoun = count
                count=count+1

            # 거리에 따라 조건
            if LpoCoun < RpoCoun:
                answer = answer+"L"
                Lpo = str(i)

            elif LpoCoun > RpoCoun:
                answer = answer+"R"
                Rpo = str(i)

            elif LpoCoun == RpoCoun:
                if hand == "right":
                    answer = answer+"R"
                    Rpo = str(i)
                elif hand == "left":
                    answer = answer+"L"
                    Lpo = str(i)

    return answer

# 1. 누를 번호를 받는다
# 2. 번호에 맞는 손으로 누른다 (초기값인 * #은 그냥 움직인다)
# 2-1. 147은 무조건 왼손 369는 무조건 오른손 (거리생각x)
# 2-2. 2480은 양손의 거리를 받아서 거리가 가까운 손이 움직인다
# 2-3. 누를때마다 양손가락의 위치를 저장한다

# aa1 = solution([1, 3, 4, 5, 8, 2, 1, 4, 5, 9, 5], "right")
aa2 = solution([7, 0, 8, 2, 8, 3, 1, 5, 7, 6, 2], "left")
# aa3 = solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 0], "right")

 


 

개발스토리

 

문제를 읽고 코드로 옮기는데 생각보다 많은 시간이 걸렸다. 구글에서 푸는 방법을 검색해서 정석대로 푸는것보다 나의 생각으로 푸는것이 훨씬 오래걸리지만 다음에 비슷한 유형의 문제를 만났을때 더욱 빠르게 풀 수 있을거라는 생각에 끈질기게 생각했다.

양쪽 끝의 숫자들은 그냥 누르면 되니 큰 걱정거리가 아니었다. 문제는 중앙렬의 숫자를 입력할때였다.

1. 중앙렬을 입력할때는 양손의 위치를 알고 있어야한다.

2. 비교해서 더 가까운 거리를 누르고 같은 거리일때 오른손잡이인지 왼손잡이인지 판단하고 거기에 맞게 누른다.

 

로직은 간단했다. 거리를 어떻게 구해오는지만 해결이 된다면 쉬웠다. 몇일을 고민해서 거리를 구하는 방법을 찾았다.

거리에 따라 2중 배열을 만들고 그걸 풀면서 못찾을때마다 count의 수를 올리며 양손의 거리를 받아왔다.

 

양손의 거리를 받아오는 문제가 해결되니 비교구문으로 바로 처리했다.

조금 아쉬운 점이 손가락의 초기 세팅 값이 *, # 라서 이에 해당되는 거리도 구해야하는 바람에

int를 억지로 str으로 바꿔주면서 해서 중간에 혼란이 왔다.

# 네오와 프로도가 숫자놀이를 하고 있습니다. 네오가 프로도에게 숫자를 건넬 때 일부 자릿수를 영단어로 바꾼 카드를 건네주면 프로도는 원래 숫자를 찾는 게임입니다.

# 다음은 숫자의 일부 자릿수를 영단어로 바꾸는 예시입니다.

# 1478 → "one4seveneight"
# 234567 → "23four5six7"
# 10203 → "1zerotwozero3"

def solution(s):
 
    dic = {"zero":"0", "one":"1", "two":"2", "three":"3", "four":"4", "five":"5", "six":"6", "seven":"7", "eight":"8", "nine":"9" }
 
    # 문자 검색
    for d in dic:
        if d in s:
            s = s.replace(d,dic[d])

    answer = 0
    answer = int(s)
    return answer

결과 = solution("one4seveneight")

개발스토리

바꿀 딕셔너리를 for문으로 돌리고 s변수로 받은 문자열에 있는지 체크하고 있으면 d를 찾아서 d의 키로 찾은 값으로 replace 해주면서 변환해서 풀었다.

# 아이디의 길이는 3자 이상 15자 이하여야 합니다.
# 아이디는 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 사용할 수 있습니다.
# 단, 마침표(.)는 처음과 끝에 사용할 수 없으며 또한 연속으로 사용할 수 없습니다.

# 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
# 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
# 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
# 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.

# 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
# 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
#     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
# 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.


def solution(new_id):

    # 1단계 소문자 치환
    answer = new_id.lower()

    # 2단계 소문자 숫자 빼기 밑줄 마침표만 남기기
    char2 = 'abcdefghijklmnopqrstuvwxyz0123456789-_.'

    for i in answer:
        if (char2.find(i) < 0):
            answer = answer.replace(i,"")

    # 3단계 .. 두개를 . 하나로 치환
    i = 1
    ii=answer.count("..")
    while i < ii:
        ii=answer.count("..")
        answer = answer.replace("..", ".")

    # 4단계 양끝 . 제거
    answer = answer.strip(".")

    # 5단계 빈문자열일때 a 추가
    if (answer == ""): answer = "a"

    # 6단계 16자 이상 자르기
    answer = answer[0:15]
    # + 양끝제거 한번 더
    answer = answer.strip(".")

    # 7단계 2자이하면 마지막 문자를 길이가 3될때까지 반복
    if (len(answer) < 3):
        plus = answer[-1:]
        while len(answer) < 3:
            answer = answer + plus

    return answer

개발스토리

각 단계별로 나누지말고 한번에 하는 방법이 없을까 고민하다가 이런저런 시도는해보았지만 실패했다. 처음 코드를 다만들고나니 테스트 검증에 실패가 자꾸 나왔다. 원인을 분석하니 3단계에서 오류가 나왔다.

  점이 4개 있다고 가정했을때 한번 리플레이스를 거치면 두개를 하나로 만들면서 다시 두개가 된다. 이부분에서 문제가 되었다. 문자열의 ..을 세서 없을때까지 리플레이스를 진행하는 방식으로 변경했다. 여러 테스트를 진행하면서 비주얼 스튜디오 코드에서 지원하는 python preview 에서는 1000 스텝을 넘어서면 계산을 중단해버렸다. 처음에는 파이썬자체에서 1000스텝까지만 지원하는줄 알고 스텝을 줄이기 위해서 코드를 자꾸만 수정했었다. 스텝상관없이 지원되는 것을 나중에서야 알게 되었지만 스텝을 줄인다는 것이 시간 단축에 효과를 보이는거 같아서 좋은 경험을 했다.

# 일부 지워진 로또번호를 보고 최고순위와 최저순위를 맞추기
# 알아볼 수 없는 번호는 0으로 표기

def solution(lottos, win_nums):

    answer = [7] * 2

    for i in lottos:
        if i in win_nums:
            answer[0] -= 1
            answer[1] -= 1

    con = lottos.count(0)
    answer[0] -= con

    if answer[1] > 6:
        answer[1] = 6
    if answer[0] > 6:
        answer[0] = 6

    # [최고, 최저]
    return answer

solution([44, 1, 0, 0, 31, 25], [31, 10, 45, 1, 6, 19])

개발 스토리

 

문제를 이해하고 풀기 시작했을때 리턴 등수를 보고 배열의 값을 0부터 시작하는 것이 아니라 반대로 시작해야겠다고 생각했다. 배열을 돌며 있는지 체크하고 있으면 값을 각각 빼고 다빼고 나면 0숫자를 카운트해서 0번째 배열에 -값을 준다. 이렇게 하고 다풀고 끝난줄알았는데 다시보니 예외처리가 잘되지 않아서 다시 해주니 통과했다.


def solution(lottos, win_nums):

    rank=[6,6,5,4,3,2,1]

    cnt_0 = lottos.count(0)
    ans = 0 # 이걸 인덱스번호로 활용함
    for x in win_nums:
        if x in lottos:
            ans += 1
    return rank[cnt_0 + ans],rank[ans]

다른분들 풀이

다른분들 푼걸 봤더니 아주 특이하게 풀었다. 나는 접근을 각각 빼면서 접근하고 아예없을경우 예외 처리를 해주면서 풀었는데 여기는 등수에 더 주목했다. 등수를 우선 배열로 만들고 찾았을때 배열 번호를 더해주었다. 그리고 마지막에 배열 인덱스 값을 대입해서 리턴해서 마무리했다.

# 각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.
    # 신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.
    # 한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.
# k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.
    # 유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.


id_list = ["muzi", "frodo", "apeach", "neo"]
id_list2 = ["con", "ryan"]

report = ["muzi frodo","apeach frodo","frodo neo","muzi neo","apeach muzi"]
report2 = ["ryan con", "ryan con", "ryan con", "ryan con"]

k = 2
k2 = 3

# 신고 성공이메일
# [2,1,1,0]
# [0,0]

# ['muzi frodo', 'frodo neo', 'apeach muzi', 'apeach frodo', 'muzi neo']

def solution(id_list, report, k):
    answer = []
    arrTarget = []
    arrReport = []

    # 중복제거
    report = set(report)
    report = list(report)

    # 배열 두개 나누기 (항상 같은 배열수)
    for i in report:
        a, b  = i.split()
        arrReport.append(a)
        arrTarget.append(b)

    # 정지기준을 채운사람은 누구인가?
    arr1 = []
    for i in id_list:
        count = arrTarget.count(i)
        if (count >= k):
            arr1.append(i)

    # 이사람을 신고한 사람은 누구인가?
    n = 0
    arr2 = []
    while n < len(arrReport):
        for i in arr1:
            if (arrTarget[n] == i) :
                arr2.append(arrReport[n])
        n = n + 1

    for i in id_list:
        count = arr2.count(i)
        answer.append(count)

    return answer

# 결과 = solution(id_list, report, k)
# 결과2 = solution(id_list2, report2, k2)

코딩 스토리

 

 시간이 오래걸린 요인으로는 문제를 보고 무턱대고 코딩을 시작했던 점이었다. 문제를 모두 이해하고 차근차근 로직을 세운 다음에 코딩을 하는 것이 오히려 빨랐다.

 처음 접근은 신고자 - 신고대상 관계여서 단순하게 1대 다 관계라고 생각하고 딕셔너리(연관배열)로 접근을 시도했다. 코딩을 하던중 1명이 한사람을 선택하지만 다른사람도 선택할 수 있고 여러번 지목이 안된다는 점에서 이미 딕셔너리 구조를 사용하지 못한다. 딕셔너리 구조는 하나의 키 하나의 값만 가지므로 1대 1 구조로 보는것이 맞았다 이때까지 키와 값으로 구성되어서 1대 다 구조로 생각해왔는데 이것은 잘못 생각했었다.

 그럼 딕셔너리는 잘못되었고 다른방법으로는 무엇이 있을까 고민하다 배열을 두개로 만들어서 for 를 돌때 두개의 배열을 같은 인덱스를 지목하도록 유도해서 해결했다. 이문제를 해결하기 위해서는 논리를 이렇게 구성했다.

 

1. 받은 배열의 중복을 제거하자 (집합으로 변경후 다시 배열로 변환) 

    - 이부분은 배열을 집합으로 변환했을때 set(배열) 의 특징중 중복이 제거된다는 점을 활용해서 중복을 제거했다

2. 문자열 띄워쓰기로 구분되어진 부분을 두개로 분리하자 (여기까지 사전 빌드업)

    - 이번 아이디어의 핵심을 사용하기 위해서는 두개의 배열을 만들어야한다

3. 정지기준을 채운 사람을 반환한다 

    -  사용자의 리스트 배열을 돌며 그값을 이용해 신고받은 사람의 배열에 접근해 신고기준에 해당되는 사람을 새로운 배열에 담는다

4. 이사람을 신고한 사람을 찾는다

    - 신고자의 배열수만큼 while문을 돌며 신고자배열을 돌며 몇번째에 겹치는지 찾는다 신고자의 인덱스를 찾기 위해서

5. 이제 누가 신고한지 알게 되었다 문제에서 받고자하는 리턴 양식으로 만들자

    - 사용자의 리스트를 돌며 신고자 리스트를 카운트한다 

 

 

++

위와같이 풀어서 결과를 받아봤더니 런타임 오류가 나왔다.. 분명 정상작동하는 코드인데 성능이 안나온다는 의미다

결국 다른 사람의 해답을 봤더니 처음 접근한 딕셔너리가 맞았다 하지만 딕셔너리를 100프로 이해하고 있던게 아니었다

 

def solution(id_list, report, k):
    answer = [0] * len(id_list) # 이렇게 미리 채워둠으로써 없을경우 빈값 또는 +연산이 가능해짐
    reports = {x : 0 for x in id_list} # 리스트를 풀어서 딕셔너리로 변환 (기억하기)

    # 신고받은인원 카운트
    for r in set(report):
        reports[r.split()[1]] += 1 # r.split()[1] 나눈후 배열인덱스 불러오는거처럼 나눈 값을 가져올수있음 (기억하기)

    # 신고한 인원 카운트
    for r in set(report):
        if reports[r.split()[1]] >= k: # 신고기준에 맞는지 확인
            answer[id_list.index(r.split()[0])] += 1 # 신고기준에 맞다면 id_list에 검색해서 그에맞는 인덱스를 받아서 해당하는 위치에 +1

    return answer

신고를 받은 인원을 딕셔너리로 만들어 관리하고 마지막에 신고기준에 맞는 배열의 첫번째를 배열에 직접 던져서 찾고 인덱스를 받아서 증가한다 여기서 시간 감축의 핵심은 뭐니뭐니해도 id_list를 미리 사전에 길이만큼 0을 깔아두는 점이다 이렇게되면 인덱스만 받아서 더하면 되니까 찾는 시간에서 확 줄어든다. 

# 변수 사용

# 전역 변수
c = 1

def plus5(a, b):
    # 전역변수를 변경하겠다고 선언
    global c
    c = 5
    result = a + b + c
    return result

결과 = plus5(2, 5)

# 함수안의 변수를 지유롭게 사용하는 방법
def fn():
    a1 = 11 # 지역변수

    def fn2():
        # 지역변수사용
        nonlocal a1
        a1 = a1 + 5
        return a1

    # a2 = fn2()
    # return a2

    # 매개변수의 활용
    def fn3(num):
        a1 = num + 5
        return a1

    a3 = fn3(a1)
    return a3


결과2 = fn()
# 자료형 집합

집합1 = set([1,2,3,4,5]);
집합2 = set("안녕하세요 반갑습니다요");
집합2_1 = list(집합2);

집합3 = set("안녕하세요 처음뵙겠습니다");

# 교집합
교집합 = 집합2 & 집합3
교집합2 = 집합2.intersection(집합3)

# 합집합
합집합 = 집합2 | 집합3
합집합2 = 집합2.union(집합3)

# 차집합
차집합 = 집합2 - 집합3

# 값 추가
값추가 = 집합1.add(8)
값추가2 = 집합1.update([7,9])

# 특정 값 제거
값제거 = 집합1.remove(2)

'코딩 공부 > PYTHON' 카테고리의 다른 글

파이썬 공부 로드맵 메모  (0) 2022.05.11
파이썬 - 변수사용  (0) 2022.04.18
파이썬 - 딕셔너리  (0) 2022.04.15
파이썬 - 배열  (0) 2022.04.14
파이썬 - 문자열  (0) 2022.04.11

// 1. 상위 제어 체크박스가 있다
// 2. 상위 제어에 따라 전체 선택 해제가 되는 하위체크박스 그룹이 있다
// (각 상위 체크박스는 하나의 하위체크박스 그룹이 있음)
// 3. 하위 체크박스의 선택에 따라 상위 체크박스를 변경한다
// 예시 상위 체크박스에는 포유류, 조류가 있고
// 포유류에는 [ 원숭이, 사자, 호랑이, 표범, 코끼리, 기린 ] 이있다
// 조류에는 [ 닭, 벌새, 까치, 까마귀, 참새, 비둘기 ] 가 있다
// 1. 여기서 원숭이를 선택하면 포유류와 원숭이가 선택되고 사자를 선택하면 사자가 선택된다
// 다른 항목인 닭을 선택하게 되면 포유류, 원숭이, 사자에 체크가 해제되고 조류, 닭이 선택된다
// 2. 원숭이, 사자, 호랑이를 선택하면 포유류, 원숭이, 사자, 호랑이에 선택되고
// 여기서 조류를 선택하면 이전의 포유류 선택이 해제되고 조류가 선택된다
// 이러한 구조를 지닌 로직을 만들어보자


// 상위 체크박스에 실행한다
function checkbox1 (otherName, otherAll) {
    let checkboxes = document.querySelectorAll(`input[name="${otherName}"]`);
    document.getElementById(otherAll).checked = false;

    checkboxes.forEach((checkbox) => {
        checkbox.checked = false;
    });
}

// 하위 체크박스에 실행한다
function checkbox2 (otherName, usAll, otherAll) {
    let checkboxes = document.querySelectorAll(`input[name="${otherName}"]`);
    document.getElementById(usAll).checked = true;

    if(document.getElementById(otherAll).checked){

        document.getElementById(otherAll).checked = false;
        checkboxes.forEach((checkbox) => {
            checkbox.checked = false;
        });
    }
}

+ Recent posts