ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2023-12-27
    스파르타/TIL(Today I Learned) 2023. 12. 27. 23:10
    더보기

    SQLD 2주차 내용에 대해서 중요하다 생각되는 요점만 줄여서 적어보자면

    DB에서 모델은 데이터베이스 관리 시스템(RDBMS)이 지원하는 데이터베이스의 구조나 형식을 의미하는데 모델링은 이것을 구조화하는 과정이나 형식화하는 과정을 의미한다. 데이터 모델링은 현실을 얼마나 추상화 시켜 표현할 것인지 그리는 과정이다. 모델링의 정의에 대하여 핵심적인 부분만 말하자면 데이터 관점의 업무를 분석하는 과정, 약속된 표기법에 의해 표현하는 과정,데이터 베이스 구축을 위한 분석 및 설계의 과정이다. 모델링의 특징으로는 추상화, 단순화, 명확화가 있다. 모델링의 단계로는 개념적 데이터 모델링, 논리적 데이터 모델링, 물리적 데이터 모델링이 있으며, 개념적은 데이터의 요구사항을 찾고 분석하는 과정, 추상화 수준이 가장 높고 업무 중심적이다. 논리적은 구조와 규칙을 명확히 하는 단계이며, 물리적은 구축할 DB관리시스템에서 테이블, 인덱스 등을 직접 생산하는 단계이다. 모델링의 관점으로써는 데이터 관점, 프로세스 관점, 상관 관점이 있으며, 데이터 관점은 어떤 데이터와 관련있는지, 프로세스는 어떻게 해야하는지, 상관 관점은 일에 의해 데이터가 어떤 변화가 일어나는지 에대하여 고민하는 관점이다. 데이터 모델리의 중요성으로는 파급효과, 간결한 표현, 데이터 품질이 있으며, 파급효과는 구체적인 내용이 변해도 큰 구조는 변하지 않도록 하는 것이고, 간결한 표현은 정보 요구사항이 정확,간결하게 표현되야 한다는 것, 데이터 품질은 데이터를 여러 곳에 같은 정보를 중복해서 저장하지 않고(중복), 환경이 바뀌었을 때도 데이터가 사용 가능해야하며(비유연성), 데이터간의 상호 연과나 관게에 대한 정확하나 정의를 내려 일관적으로 데이터를 관리하여(비일관성) 품질을 올려야합니다. 프로젝트 라이프 사이클이란 대표적으로 폭포수와 애자일 모델이 있으며, 폭포수 방법론으로 첫 두 단계가 중요한대 분석에서 논리 및 개념 데이터 모델링을 하고 설계에서 물리 데이터 모델링을 합니다. 추가로 데이터 모델링은 IT와 관련있다고 생각되는 모든 사람이 이해하고 해석 가능해야합니다. 데이터의 독립성이 독립성을 확보하지 않는다면, 유지보수 중복성 증가, 유지보수 비용 증가, 요구사항 대응 저하, 데이터 복잡도 증가의 문제가 나타날 수 있어 확보해 줘야한다. 그것을 위한 구조 중 하나?가 3층 스키마 이다 외부단계, 개념단계, 내부단계 이렇게 3개의 단계로 나누어지고 외부는 최상위, 여러 사용자, 개념은 물리적인 저장구조등은 숨기고 데이터의 전체적인 구조와 관계, 모든 사용자 관점을 통합한 조직 전체DB, 내부는 물리적으로 실제 저장된 단계를 말하며 이렇게 3단계로 분리함으로써 각각 독립성을 확보할 수 있다. 외부와 개념사이의 mapping에서는 논리적 독립성을, 개념과 내부사이의 mapping에서는 물리적 독립성을 확보할 수 있다. 데이터 모델링의 가장 중요한 개념인 요소 3가지는 데이터 모델링에서 사용되는 하나의 대상,객체인 엔티티, 엔티티가 가질 수 있는 여러 특징인 속성(Attribute,어트리뷰트), 엔티티와 엔티티사이에 가지는 관계인 관계(Relationship,릴레이션쉽)이다. 데이터 모델링을 위한 ERD(Entity Relationship Diagram)은 데이터들의 관계를 나타낸 도표로 작성법은 엔터티를 정의하고 그리고 적적하게 배치하는데 가장 중요한것을 좌측 상단으로 중심하여 왼쪽에서 오른쪽으로, 위에서 아래로 나열한다. 그리고 엔티티간의 관계를 설정하, 관계명을 서술, 관계의 참여도를 기술하며, 마지막으로 관계의 필수여부를 기술한다. 좋은 데이터 모델을 평가하는 절대적인 기준은 존재하지 않지만 전반적으로 모든 데이터가 모델에 정의되어야한다는 완전성, 동일한 사실은 한번만 기록해야한다는 중복제재, 데이터 모델링 과정에서 도출되고 규명되는 수많은 비지니스 룰을 데이터 모델에 표현하고 이를 해당 모델을 활용하는 모든 사용자가 공유할 수 있도록하는 업무규칙, 언제든 다시 사용할 수 있는 형태로 가공하고 보관하는 데이터 재사용, 의사소통 도구로서의 역할을 해야한다는 의사소통, 동일한 데이터 구조는 조직 전체에서 한번만 정의되고 여러 다른 영역에서 참조, 활용하는 통합성을 기준으로 잘 되어있다면 대게 좋은 데이터 모델이라고 평가될 수 있다.

    여태  SQL은 비교적 간단한 문제들이 많았고, 푸는 문제수가 몇개 되지 않아 잘 적지 않았는데, 이제는 SQL을 좀더 깊이 공부를 해봐야할 것 같아서 푸는 문제수를 조금 더 늘리고 고민했거나 적을만한 사유가 있다고 생각되는 문제들을 기록으로 남겨둘 생각이다

     

    더보기

    입양 시각 구하기 (SQL time format)
    https://school.programmers.co.kr/learn/courses/30/lessons/59412

    해당 문제를 푸는데 강의에서 날짜,시간 format 변경 관련하여 time도 있다고 얘기는 했지만, 뭐가 있고 어떻게 쓰는지는 자세히 알려주지 않아서 한번도 써보지 못하였는데 이번에 관련하여 사용할 법한 문제가 있어 테스트해보았다

    %h하면 무조건1~12시(오전오후상관없이)표시 %H하면 0~23시까지 인듯하며

    select HOUR,
            count(HOUR) COUNT
    from
    (SELECT datetime,time_format(time(datetime), '%H') HOUR
    from ANIMAL_OUTS)a
    where (HOUR>=9 and HOUR<20)
    group by 1
    order by 1

     해당 문제에 대한 코드는 이렇게 작성하여 제출하였다.

    원래 time 포맷에 대하여 다양하게 테스트 해보고 싶었지만, 주어진 데이터가 분,초 등에 대하여 00이 너무 많았던 관계로 제대로 쓰인건지 아니면 잘못 나와서 00이 나온 것인지 등 조금 헷깔리는 부분이 있어 다음에 테스트하기 좋은 데이터가 보이면 다시 테스트 해볼 생각이다. 그리고 아래에 참고하면 좋을 MySQL 메뉴얼 사이트이다

    https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format

     

    더보기

    12세 이하인 여자 환자 목록 출력하기(데이터의 값이null로 주어진 경우 경우따라서 나눠서 값 넣기)

    https://school.programmers.co.kr/learn/courses/30/lessons/132201

    해당 문제를 풀면서 관련된 내용으로

    SELECT PT_NAME,PT_NO,GEND_CD,AGE,
            if (TLNO is NUll,'NONE',TLNO) TLNO
    from PATIENT
    where (AGE <=12 and GEND_CD='W')
    order by 4 desc,1
    

     다음과 같이 코드를 작성하여 제출하였으며, 처음에는 null에 대하여 TLNO = NUll로 적었는데 인식 못하였다. 그래서 위 코드와 같이 수정하니 정상 작동하였는데 Null은 무조건 is랑 사용하는 것 같다.

     

    더보기

    자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기( 만약 여러 개를 포함하는 것이라면?, 왜 IN으로 쓰면 안될까? )

    https://school.programmers.co.kr/learn/courses/30/lessons/151137

    직접 테스트를 해봐야 할듯 하지만 옵션중 하나 이상이 아니라 여러 개를 동시에 포함하고 있는 경우라면, 예상으로는 or 와 and를 섞어서 여러 개 써서 조합하면 할 수 있을 것으로 예상된다. 직접 해보지는 못하였다 SQL관련해서는 코드 테스트를 잘 못해보는데 테스트를 해볼 방법을 한 번 모색해봐야 할 듯하다.

    SELECT CAR_TYPE,
            count(1) CARS
    from CAR_RENTAL_COMPANY_CAR
    #where OPTIONS in ('통풍시트', '열선시트', '가죽시트')
    where (OPTIONS like '%통풍시트%' or OPTIONS like '%열선시트%' or OPTIONS like '%가죽시트%')
    group by 1
    order by 1
    

     코드에서 in으로 된 부분은 처음에 시도했다가 아무런 값도 출력되지 않는 결과가 나와 주석처리해버린 부분인데 처음 생각으로는 in으로 해도 충분히 될 것이라고 생각했는데, chatGPT를 통해 대강 원인을 확인하고 읽은 글을 통해아마 정확히 통풍시트, 열선시트, 가죽시트 중 한 개가 존재하는 것이 아닌 "통풍시트, 열선시트, 가죽시트" 이런 식으로 되어 있어 되지 않는 것이라 예상하였다 (튜터님에게 확인해본 결과 그것이 맞았다.)(다음 링크는 chatGTP를 이용하여 질문한 내역이 기록된 문서이다) https://chat.openai.com/share/b7bbd0ff-cd4c-40c5-a9e5-297148aa8481

    튜터님께 확인해본 결과 in은 or같은 느낌으로 다 묶어준다라고 생각하면 됨 (컬럼=값 or 컬럼=값 …) 이런 느낌 따라서 car_type의 세단, SUV 등 으로 검색해 달라고 할 때는 잘 될 수 있다.

    그리고 원래 데이터에는 원자성?이라는 규칙이 있어 한 컬럼의 한셀에는 하나의 값만 적어야한다고 한다(그런 기준에서 봤을 때 이 데이터는 그것을 어긴 것) 그래서 보통 저런식으로 여러 옵션을 가지고 있는 것을 기록해줄 때는 컬럼을 여러 개 하여 옵션1에 통풍시트, 옵션2에 열선시트 등 이런식으로 적고 옵션이 1개뿐이면 옵션2부터는 null값으로 입력→ 이게 처음 내가 생각한 방식이고 이 방법도 있지만, 다른방법으로 튜터님이 얘기해주신 방법은 행을 여러개로 쪼개서 입력하는 방법이다 만약 car1이 옵션으로 가죽시트와 열선시트, 후방카메라를 가지고 있다면 car1 옵션 가죽시트, car1 옵션 열선시트, car1 옵션 후방카메라 이런 식으로 행을 여러 개로 쪼개서 입력해둔다고 한다

    car option
    car1 가죽시트
    car1 열선시트
    car2 스마트키

    그리고 여담으로는 like는 검색 능력이 안 좋아서 대용량 데이터를 검색할 때는 잘 안 될 가능성이 높다고 하셨다.

    +chatGPT 내역 링크이  링크 발급후 질문을 추가로 하게 되어 포함하고자  다시 새로 공유버튼을 눌러 링크를 받았는데도 내용이 업데이트 된 것으로 나오지 않아 의아했는데 이전에 링크 만들었던 것을 share link to chat에 들어가서 점세개 누르고 delete link하여 삭제 후 다시 새로 해야 업데이트 된 내용까지 포함된 것으로 새로 링크가 발급된다는 것을 알게 되었다

     

    더보기

    오랜 기간 보호한 동물(1) (여러 테이블을 비교하여 데이터 필터링(A에는 있는데, B에는 없는 기준으로 필터링 할듯))

    https://school.programmers.co.kr/learn/courses/30/lessons/59044

    SELECT I.Name, I.datetime DATETIME
    from ANIMAL_INS I left join ANIMAL_OUTS O on I.ANIMAL_ID=O.ANIMAL_ID
    where O.Datetime is null
    order by DATETIME #보호 시작일 순
    limit 3 #가장 오래 있던 3마리

     조금 긴가민가했었는데 생각 보다 간단히 완료 되었다. 하지만 운좋게 간단히 해결한 것일 수 도있어 처음 써보는 방식을 (컬럼이름이 같아도 각각 테이블명.컬럼 으로 사용하여 구분한 방식) 기록해둔다.

    (코드 블럭이 한 게시물에서 설정이 공유 되는 듯한데 해결방안이 있는지 아니면 SQL 관련 따로, 파이썬 따로 할지 아니면 크게 지장없으니 그냥 쓸지는 고민을 좀더 해봐야 할듯하다)

    더보기

    덧칠하기 문제 관련 (python)
    https://school.programmers.co.kr/learn/courses/30/lessons/161989

    해당문제에 간단히만 설명하면 n길이의 벽을 m길이의 룰러로 페인트칠하는데 구역별로 비어서 칠해야하는 구역이 주어지고 해당 상황에서 최소 몇번의 페인트 칠을 통해 페인트칠을 끝낼 수 있을까라는 내용의 문제이다.

    처음에 리스트를 만들어 그 원소들을 0이 칠해야하는 곳으로 설정하고 하는 방식으로 코드를 짰는데 솔직히 효율적인 면에서 보면 그냥 단순 계산만 해도 될듯한데 다른 것과 연계해서 시각화를 할 필요가 있다면 내 방식이 좋을듯해서 비효율적이지만 잘안되도 계속 잡아보았다

    def solution(n, m, section):
        answer = 0
        wall= [1 for i in range(n)] #안 칠해진 부분을 0으로 표기
        for i in section:  #칠해야 하는 빈 곳 적용 i=구역번호
            wall[i-1]=0 #2번 벽의 인덱스 주소의 경우 1이므로 번호-1
         
        for j in range(n):  #벽 칠하기 작업 여기선 인덱스와 번호 맞춰주기
            if wall[j]==0:  #j=인덱스
                for k in range(j,j+m): #m개를 같이 칠할 수 있으므로
                    wall[k]+=1 
                answer+=1    
        return answer
    

    < 처음코드>

    제일 처음 작성한 코드인데 하나의 테스트 케이스에서 IndexError: list index out of range가 발생하였고 코드를 점검해본 결과 룰러가 벽을 넘어가는 경우를 적용하지 않아서 범위를 벗어나게 되어 뜬 에러였다 그래서 벽에 딱 붙여서 칠한다로 해결하였지만 가끔 몇몇 경우에 대하여 칠할 필요가 없는데 마지막에 딱붙여서 추가적으로 칠해주는 경우가 생겼고 그래서 틀린 결과를 내놓았다 벽에 붙여서 칠한다는 부분을 추가해준 코드는 다음 이어지는 코드이다.

    def solution(n, m, section):
        answer = 0
        wall= [1 for i in range(n)] #안 칠해진 부분을 0으로 표기
        for i in section:  #칠해야 하는 빈 곳 적용 i=구역번호
            wall[i-1]=0 #2번 벽의 인덱스 주소의 경우 1이므로 번호-1
        for j in range(n):  #벽 칠하기 작업 여기선 인덱스와 번호 맞춰주기
            if wall[j]==0:  #j=인덱스
                for k in range(j,j+m): #m개를 같이 칠할 수 있으므로
                    wall[k]+=1
                    if n-k<m:
                        if wall[k]==0:        #만약 칠할때 룰러가 벽을 넘으면
                            wall[n-m]+=1 #왼쪽으로 살짝이동하여 룰러가 벽끝에 닿게 칠함#
                        break 
                answer+=1    
        return answer
    

     <그 다음 코드>

    하지만 제출평가에서 실패한 케이스가 매우 많이 발생하여 알고리즘에 오류가 없는지 다시 점검하였고, 점검하던 도중 칠하는 과정 알고리즘 자체는 맞게 한듯하였고, 리스트 연산에 관하여 IndexError: list index out of range가 발생하여 문제가 되었기에, 옛날에 오목을 파이썬으로 구현하여 연산 시킬 때 실제 두는 바둑판 보다 더 넓은 범위의 가상의 판까지 만들어서 계산해 주었던 것이 생각났고 이번에도 그렇게 하면 될듯하여 그냥 실제 벽에는 존재하지 않는 리스트 계산을 위한 가상의 벽을 추가하여 연산하면 잘 해결될 듯하였고 따라서 그렇게 수정하여 잘 해결하였다.

    def solution(n, m, section):
        answer = 0
        wall= [1 for i in range(n+m)] #안 칠해진 부분을 0으로 표기
        for i in section:  #칠해야 하는 빈 곳 적용 i=구역번호
            wall[i-1]=0 #2번 벽의 인덱스 주소의 경우 1이므로 번호-1
             #존재하지 않는 리스트 계산을 위한 가상의 벽을 룰러 길이만큼 벽에 추가
        for j in range(n):  #벽 칠하기 작업 여기선 인덱스와 번호 맞춰주기
            if wall[j]==0:  #j=인덱스
                for k in range(j,j+m): #m개를 같이 칠할 수 있으므로
                    wall[k]+=1 
                answer+=1    
        return answer
    

     <최종코드>

    +추가 여담으로 파이썬 빈 리스트 만들기, 초기값 설정 관련하여 주로 for 이용해서 생성 많이 하던데 막 numpy에서 zeros라고 해서 0으로 이루어진 것 이라던가 여러 개 있었던 것 같은데 당장은 필요없어서 안 적어놨지만 이왕 떠올랐을 때 나중에 찾아볼 예정이다.

     

    더보기

    갑자기 for문이랑 while문 중에 어느 것이 연산속도가 더 빠른지 궁금해서 chat gpt에게 물어보다 알게된 것

    https://chat.openai.com/share/eae9ddd3-c168-4d91-9f85-2791d6c5b4f0

    위가 질문 대화내역이다 결론만 따지면 속도 자체는 크게 차이 나지 않으며 보통 for문이 사용이 용이해 대부분 for문을 많이 사용한다고 답하였다

    +추가로 프로파일링 도구라는 것들이 있다고 한다. cProfile, line_profiler, memory_profiler,Py-Spy등이 있다고한다(최적화용도) 항상 최적화를 능력내에서 하고 싶었는데 할 수 있는 방안을 찾았으니 여유될 때 시도 해볼 예정이다.

     

    더보기

    기사단원의 무기 문제 (대강 약수의 갯수와 관련된 문제)(python)

    https://school.programmers.co.kr/learn/courses/30/lessons/136798

    해당 문제로 간단히 설명하면 기사단원의 무기는 해당 기사단원의 번호의 약수의 갯수에 따라 달라지며 대신 최대 갯수가 정해져있어 그 수를 넘을 경우 추가로 그에 따른 정해진 규격 공격력을 가진 무기를 사게 된다 대강 기사단 전체 기사단원의 공격력(문제에선 ~에 따른 철의 양이지만 철이 공격력 1당 1kg으로 비례하므로 큰 의미 없음)구하기이다

    처음에는 전에 약수들의 리스트를 만드는 것을 이용하여 약수의 갯수를 구하는 것으로 활용했었는데 약수들의 리스트의 길이를 출력하도록 살짝 수정하여 활용하였는데 시간이 너무 오래 걸린다고 나왔었다.

    #약수들의 리스트
    def divisors_list(num):
        return [i for i in range(1, (num // 2) + 1) if num % i == 0]+[num]

    그래서 리스트를 구할 때 자기자신을 포함해주기 위해 자기자신의 수만을 포함한 리스트를 추가하여 구하는 방식으로 했는데 이게 조금 속도가 느려진 것에 영향이 있지 않나 해서 지우고 그냥 깡으로 len()+1하는 식으로 했더니 조금 빨라지긴 했으나 크게 차이는 없었고, 그래서 그냥 리스트를 만들지 않고 바로 세어주는 방식으로 약수의 갯수만을 구해주는 함수를 새로이 만들었다

    #약수의 갯수
    def divisor_count2(num): #확인범위 1/2으로 하여 조금 느림 (전부보는 것보단 빠름)
        count=1
        for i in range(1,(num // 2) + 1):
            if num % i ==0:
                count+=1
        return count
    

    약수인지 확인하는 범위는 1~N까지가 아닌 N/2까지만으로 하였는데 이는 약수의 리스트를 만들어줄 때 N/2까지만 확인해도 자기 자신을 제외한 나머지 약수들이 다 확인되기 떄문에(좀 더 엄밀히 말해주면, N/2보다 큰 값의 경우 더 이상 자기자신의 수를 제외하고는 자연수로 나누어지는 수가 없다 그래서 N/2가 마지막으로 2로 나눠지는 수이므로 N/2까지만 확인하여도 된다) 더 범위를 줄이고 싶을 경우 보통 n의 1/2승을 생각하게 되는데 약수의 리스트의 경우 n의 1/2승 까지만 확인할 경우 단순히 한번 확인하고 추가하는 과정으로는 약수를 다 확인할 수 없어 그 방법은 사용하지 않았다(추가로 처리과정을 넣어준다면 범위를 n의 1/2승로 줄일 수 있을 듯하다. 확인한 범위 내의 약수들을 곱해주거나 하는 과정을 통하여 하지만 왠만한 수에서는 굳이 복잡하게 할 필요가 없을 듯하여 N/2까지만 줄여주었다 사실 더 줄이고싶다면 N/3하고 추가로 N/2에 대해 나누어 떨어지는지 확인 등 방법은 더 있을듯하다) 말이 길어졌는데 그래서 약수들의 갯수를 확인하는 작업을 해줄 때도 확인하는 범위를 N/2로 하였었는데 처음에 비하면 꽤 빨라지긴 했지만 여전히 제출평가를 했을 시 시간초과가 뜨는 케이스가 몇 존재하였기에 더 줄여야 할 필요를 느꼈고 질문하기에 들어가서 시간 초과의 해결책에 대해 찾아본 결과 n의 1/2승로 범위를 줄인다면 획기적으로 빨리 줄일 수 있다는 것을 알게 되었다. N/2로 했을 때와 비슷하지만 제곱근값까지 확인하여 짝에 해당하는 ex) 24의 경우 24의 양의 제곱근 값은 약4.90정도 되니 1부터 4까지만 확인하여도 (1,24),(2,12),(3,8),(4,6) 이런식으로 짝을 찾을 수 있어 반만 계산한뒤 세어줄 때 2개씩 세어주면 된다(count+=2를 의미) 그리고 추가로 제곱수의 경우 어떤수의 제곱이 되기에 그 어떤 수는 1개로 짝이 없기에 약수가 홀수개가 되며 이 경우에 대해서만 추가로 1개를 세어주면된다. 이를 적용한 약수의 갯수를 구한 코드는 다음과 같다, 추가로 문제해결코드를 통채로 같이 가져왔다.

    def divisors(num): #약수의 갯수를 리턴해주는 함수
        count=0
        for i in range(1,int(num ** 0.5)+1): #제곱근한 값의 이전까지 체크
            if num/i==i:
                count+=1
            elif num % i ==0:
                count+=2
        return count
    
    def solution(number, limit, power):
        answer = 0
        for i in range(1,number+1):
            if divisors(i)<=limit: #제한 수치보다 작거나 같은 무기
                answer+=divisors(i)
            else: #제한 수치보다 큰 무기
                answer+=power
        return answer
    

    성공적으로 시간을 줄여 더이상 런타임아웃 에러가 나타나지 않고 제출 할수있었다.(아래 계산도 더 줄일 수 있을지 모르겠으나 막상 바로 떠오르는게 없었고 충분한 결과를 얻었다고 생각하여 일단 마무리 지었다. 나중에 더 줄일 방법이 있는지 다른 사람들의 코드를 확인해보아 보안할 부분은 보안해볼 생각이다.)

     

    더보기

    옹알이2 , 공백 확인하는 메소드(python)

    https://school.programmers.co.kr/learn/courses/30/lessons/133499

    해당 문제는 조카가 아직 어려 네가지 발음을 할 수있는데 몇가지 추가 조건을 더하여 문자열이 들어있는 배열을 주고 이중 조카가 발음 가능한 문자열은 몇개인가 묻는 문제이다.

    처음에 나올리 없는 아예 다른 문자로 적을까하다가 가장 리소스가 적은 문자가 무엇인지 확인해서 사용할려고 chatGPT에 물어봤는데 공백문자이며, 확인하는 메소드는 isspace()라고 한다. 개인적으로 코드 관련하여 물어봤을 때 제대로된 답을 해주지 못한 적이 있다는 점, 그리고 꽤 이전이라면 이전일 수 있지만 chatGPT에게 다른 생소한 정보를 물었을 떄 사실이 아니지만 그럴싸하게 소설을 적어 알려준 적도 있다는 전적을 미루어봤을 때 곧이곧대로 믿을 수는 없지만 내 생각에도 공백문자가 제일 리소스가 적을 것 같기도하고 일단은 그렇다는 가정하게 진행하여도 크게 문제가 없기에 그것을 기반으로 코드를 작성해보았다

    https://chat.openai.com/share/6d0074f7-2965-443f-9403-8edeaa1f6abc

    def solution(babbling):
        answer = 0
        can=["aya", "ye", "woo", "ma" ]
        for i in babbling:
            for c in can:
                if c*2 not in i: #연속으로 쓰이는 부분이 있으면 발음불가이므로
                    i=i.replace(c,' ')#아닌경우에대해서만 계산
            if i.isspace():
                answer+=1
        return answer
    
    #해당하는 부분 공백으로 만들다보면 순서대로 다 해당하게 되었다면
    #공백만 남을 것이지만, 해당하는 단어로 규칙에 맞게 지울수 없다면 글자가 남게 되므로
    #공백인지 판별하는 메소드를 통해 판별 가능할 것이다
    

     추가로 문자의 in에 대하여

    print("ab"in"cadb") #붙어서 ab가 순서가 어디든 있으면 True
    print("ab"in"abcd")
    print("ab"in"cabd")
    
    #결과
    #False
    #True
    #True
    

    예상대로 ab를 한 덩어리로 봤을 때 해당 덩어리가 안에 포함되어 있는지에 따라 T/F여부가 결정되는 듯하다

    추가로 공백에 대하여 문자열 글자길이 계산에 대해 확인해보았는데 공백도 여러번 들어가면 여러 개로 센다 (공백도 문자길이 1개로 계산된다)라는 결론을 얻었다

    print(len('  ')) #2번 띄어쓰기함=공백2개
    
    #결과
    #2
    

     그리고 위에 사용한 isspace 메소드에 대하여 isspace()는 완전히 공백만 있을 때만 True로 나온다

     

    더보기

    숫자 짝궁 문제 (딕셔너리(Dictionary)이용, 문자열 count 이용)(python)

    https://school.programmers.co.kr/learn/courses/30/lessons/131128

    def solution(X, Y):
        answer=''
        x_dict={'0':0,'1':0,'2':0,'3':0,'4':0,'5':0,'6':0,'7':0,'8':0,'9':0}
        y_dict={'0':0,'1':0,'2':0,'3':0,'4':0,'5':0,'6':0,'7':0,'8':0,'9':0}
        for i in range(10): #0~9까지 숫자 갯수 세어서 기록
            x_dict[str(i)]=X.count(str(i))
            y_dict[str(i)]=Y.count(str(i))
            
        for i in range(9,-1,-1): #9~0까지 둘 중 작은 것 기준으로(공통이니) 불러와서 답 문자열작성
            answer+=str(i)*min(x_dict[str(i)],y_dict[str(i)])
            
        if answer =='':
            return "-1"
        
        if answer[0]=="0" and len(answer)>1:
            answer="0"        
        return answer
    

    처음에는 replace를 이용하여 체크한 문자에 대해서는 ‘’으로 바꿔 지우는 방식을 생각하였는데 계속 예상과 다른 결과가 나와서 다시 확인하면서 생각하니 replace는 해당 원소를 검색하여 모든 해당 원소를 제거하기 때문에 젤 앞에있는 것만 순서대로 지울용도로 생각한 내 의도와 달라 다르게 나온 것이였다. 그래서 다른 방법을 생각해보던 중 문자열에 대하여 count가 꽤 강력하고 연산이 빨랐던 것으로 기억해서 해당하는 숫자 문자열들이 몇 개가 있는지 딕셔너리 변수에 기록하여 이용하면 좋을 것 같았고 직접 비교를 하지는 못하였지만, 예상보다 매우 빠르게 연산되어 좋을 결과를 얻을 수 있었다. 역시 문자열에서는 count가 엄청 좋은 메소드라 생각이 든다. 그리고 딕셔너리 형태의 변수가 초반에 입력은 번거러웠지만, 다 입력하고 나니 그 뒤로는 표현 등이 매우 편하였던 느낌이였다. 안 익숙해서 딕셔너리 형태는 잘 쓰지않았는데 앞으로 써볼만하다면 시도하는 것도 좋을 듯하다.

     +추가로 딕셔너리 자료형에 대하여 간단히 사용법에 대해서만 적자면

    dictionary_name = {키: 값}

     의 형태로 선언해준다.

    dictionary_name[key]

     특정 키의 값에 대해 접근하는 기본 방법이다

    dictionary_name[key] = value

     값을 수정하고 싶다면 기본적으로 다음처럼 써주면 수정이 가능하다

    그외 다양한 관련 내용이 있지만 우선은 간단히만 알아보았고, 다양하게 딕셔너리를 써야할 일이 온다면 그 때 좀더 자세히 공부해 볼 예정이다.

    오늘은 원래 SQLD강의를 이번 주 내로 들어야 하기 때문에 코드카타를 적게 풀고 강의에 집중할 예정이였으나, SQL 코트카타를 조금만 더풀어봐야지, 파이썬 잠깐 시간 애매한데 한 문제만더.. 라는 생각으로 하다보니, 또, SQLD 초반주차의 내용이 생소한 데이터베이스 이론이 주라 한 주차 내용을 듣는데 거의 2시간쯤이 걸려버려 한 주차 내용밖에 듣지 못하였다.

    아무래도 코드카타는 최소 문제만 후딱 풀어둔 뒤 일정량 이상의 강의를 듣고 시간적 여유 등에 따라 추가적으로 공부를 그때 그때에 맞춰서 진행할 듯하다.

    '스파르타 > TIL(Today I Learned)' 카테고리의 다른 글

    2023-12-29  (1) 2023.12.29
    2023-12-28  (1) 2023.12.28
    2023-12-26  (1) 2023.12.27
    2023-12-23  (0) 2023.12.23
    2023-12-22  (0) 2023.12.22
Designed by Tistory.