작년 11월 비상대책위원회와 협력하여 총선거 프로젝트를 진행했었다

이후 올해 3월 보궐선거로 변경해서 재진행 하기로 했다.

 

원래는 총선거 > 보궐선거로 모든 텍스트와 콘텐츠들을 다 바꿀 계획이었지만 아예 덮어버리기가 아쉬워서 총선거도 살리면서 보궐선거를 할 수 있는 방법이 없을까 ... 구상하다가 경로 분리를 해보기로 했다.

 

원래는 URL/voting, URL/candidate 이었다면

총선거 > URL/main-election/voting, URL/main-election/candidate

보궐선거> URL/by-election/voting, URL/by-election/candidate 형식으로

URL 하위 경로를 기준으로 완전히 페이지를 분리하려고 시도했던 것이다.

 

기존은 App.js에서 모든 경로를 라우팅하여 URL/ 을 시작으로 바로 하위에 경로가 바뀌는 방식이었다.

이와 조금 다르게 App.js에서는 

먼저 크게 두 분류로 main-election 총선거 / by-election 보궐선거로 분리한다음 각 컴포넌트 안에서 또 라우팅을 진행했다.

function App() {
  return (
    <BrowserRouter>
        <Routes>
          <Route path='/' element={<MainPage />} />
          <Route path='/main-election/*' element={<MainElection />} />
          <Route path='/by-election/*' element={<ByElection />} />
        </Routes>
    </BrowserRouter>
  );
}

App.js


MainElection 컴포넌트 하위에 한번 더 라우팅

이곳에서 라우팅된 것들은 이제 main-election/Election 형식으로 접근할 수 있는 것이다.

주의할 점은 path=내부에 '/election' 형식으로 적는 것이 아니라 path='election' 형식으로 / 없이 경로를 작성해야 한다.

function MainElection() {
  return (
      <div className="App Font_bombaram relative">
        <div div className="leftDate absolute top-16 left-1 verticalLeft text-3xl" >2024.11.20-11.22</div>
        <div className="rightDate absolute bottom-48 right-1 verticalRight text-3xl">2023.11.20-11.22</div>
        <MainNav />
        <Routes>
          <Route path='' element={<Main />} />
          <Route path='Election' element={<Election />} />
          <Route path='Candidate' element={<Candidate />} />
          <Route path='Map' element={<Map />} />
          <Route path='About' element={<About />} />
          <Route path='CandidateInfo' element={<CandidateInfo />} />
          <Route path='Voting' element={<Voting />} />
          <Route path='CandidateContent' element={<CandidateContent />} />
        </Routes>
      </div>
  );
}

export default MainElection;

MainElection.js


ByElection도 같은 방식으로 진행했다.

경로는 변경하지 않고 컴포넌트만 보궐선거로 보일 수 있도록 수정한 것이다.

function ByElection() {
  return (
      <div className="App Font_bombaram relative">
        <div div className="leftDate absolute top-16 left-1 verticalLeft text-3xl" >2024.03.25-03.27</div>
        <div className="rightDate absolute bottom-48 right-1 verticalRight text-3xl">2024.03.25-03.27</div>
        <ByMainNav />
        <Routes>
          <Route path='' element={<ByMain />} />
          <Route path='Election' element={<ByElectionPage />} />
          <Route path='Candidate' element={<ByCandidate />} />
          <Route path='Map' element={<ByMap />} />
          <Route path='About' element={<ByAbout />} />
          <Route path='CandidateInfo' element={<ByCandidateInfo />} />
          <Route path='Voting' element={<ByVoting />} />
          <Route path='CandidateContent' element={<ByCandidateContent />} />
          <Route path='PledgeBook' element={<PledgeBook />} />
          <Route path='CampaignVideo' element={<CampaignVideo />} />
          <Route path='Manifesto' element={<Manifesto />} />
        </Routes>
      </div>
  );
}

export default ByElection;

ByElection.js


위와 같은 방식으로 경로 설정은 성공했다. 

이후 보궐선거로 콘텐츠들을 바꿀 생각을 하니 ,,

총선거의 모든 페이지와 컴포넌트들을 동일하게 복사해서 보궐선거로 변경해야 하는 것일까 ........? 하는 의문이 들었다.

이건 너무 막노동인 것 같았고 조금 더 머리를 굴려보니 답을 얻을 수 있었다.

 

하나의 js 파일 안에 하나의 컴포넌트를 만드는게 일반적이다.

권장하는 것은 아닌 것으로 알고 있지만, js 파일 안에 컴포넌트 여러 개를 만들어도 된다.

이번 프로젝트의 경우 하나의 js 파일 안에 두 개의 함수형 컴포넌트를 만들어서 총선거 / 보궐선거로 구분하면 되겠다고 생각했다. 

모든 파일들 안에 By~와 같이 컴포넌트를 하나 만들어주고 보궐선거로 진행하기 위해 문구들을 바꾸어주었다.

이렇게 해서 도메인을 분리하지 않고, 라우팅을 다르게 해서 총선거, 보궐선거를 같이 볼 수 있게 했다.

 

Day25 이차원 리스트(배열)

  • 정수를 나선형으로 배치하기
  • 특별한 이차원 배열 2
  • 정사각형으로 만들기
  • 이차원 배열 대각선 순회하기

정수를 나선형으로 배치하기

문제 설명

양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.
def solution(n):
    answer = [[None for j in range(n)] for i in range(n)]
    move = [[0, 1], [1, 0], [0, -1], [-1, 0]]
    x, y, m = 0, 0, 0
    for i in range(1, n**2 + 1):
        answer[y][x] = i
        if y + move[m][0] >= n or x + move[m][1] >= n or answer[y + move[m][0]][x + move[m][1]]:
            m = (m + 1) % len(move)
        y, x = y + move[m][0], x + move[m][1]
    return answer

 

이 문제는 도저히 혼자 힘으로 풀 수가 없어서,, 도움을 .. 받았다

move에 이동할 좌표를 담음, 순서는 우>하>좌>상 

처음에 아래로 이동하는데 y좌표가 왜 +1인가 했는데

값 기준이 아니라 인덱스 기준으로 움직이니까 아래로 갈 때 +1 위로 갈때 -1이다.

move[m][0] > 0번째 인덱스는 항상 y 좌표 (0 or -1 or +1)

move[m][1] > 1번째 인덱스는 항상 x 좌표 (0 or -1 or +1)

 

move값으로 방향에 따라 이동하다 값이 n보다 커지면 방향을 바꿈(m값 변경)

m은 방향 맨처음 m=0 우로 이동 > m=1 하 > m=2 좌 m=3 상

 

아~~~~~~~~~~ 어렵다 큰일났다


특별한 이차원 배열 2

문제 설명

n × n 크기의 이차원 배열 arr이 매개변수로 주어질 때, arr이 다음을 만족하면 1을 아니라면 0을 return 하는 solution 함수를 작성해 주세요.

0 ≤ i, j < n인 정수 i, j에 대하여 arr[i][j] = arr[j][i]

 

def solution(arr):
    answer = 0
    length = len(arr[0])

    for i in range(length):
        for j in range(length):
            if arr[i][j] == arr[j][i]:
                continue
            else:
                return 0

    return 1

정사각형으로 만들기

문제 설명

이차원 정수 배열 arr이 매개변수로 주어집니다. arr의 행의 수가 더 많다면 열의 수가 행의 수와 같아지도록 각 행의 끝에 0을 추가하고, 열의 수가 더 많다면 행의 수가 열의 수와 같아지도록 각 열의 끝에 0을 추가한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(arr):
    arrLen = len(arr)
    arrarrLen = len(arr[0])
    gap = arrLen-arrarrLen

    if len(arr) == len(arr[0]):
        return arr
    elif len(arr) > len(arr[0]):
        for i in range(len(arr)):
            for _ in range(gap):
                arr[i].append(0)
    else:
        for _ in range(abs(gap)):
            arr.append([0]*arrarrLen)

    return arr

행 길이가 더 길면 열에 행-열 차이만큼 0 추가하기

열 길이가 더 길면 0으로 채워진 열 길이만큼의 배열을 행에 추가하기

 

어렵다 .....그래두 풀었다 ....


이차원 배열 대각선 순회하기

문제 설명

2차원 정수 배열 board와 정수 k가 주어집니다.i + j <= k를 만족하는 모든 (i, j)에 대한 board[i][j]의 합을 return 하는 solution 함수를 완성해 주세요.

 

def solution(board, k):
    answer = 0
    for i in range(len(board)):
        for j in range(len(board[0])):
            if i + j <= k:
                answer += board[i][j]

    return answer

이중 포문으로 이차원 배열 반복 인덱스 i+j가 k보다 작을때, 해당 인덱스의 값을 answer에 계속 더함

 

손으로 먼저 다 풀고 코드치는게 훨씬 머리 잘 돌아가고 빠르다.

점점 더 어려워지면 먼저 코드칠 생각은 꿈에도 못하겠지 ...


마지막 날이라고 갑자기 난이도가 확 ㅠㅠ 뛰어버린 ... 이것저것 하다가 4문제 이틀이 되어서야 다 풀어버린. ..!!

그래도 다 풀었다 기초 트레이닝 문제 25일차까지 완 !!!! 뿌듯 .... 

 

쉬운 문제도 많았지만 애매하게 헷갈리는 문제들도 많았어서 딱 기초 감잡기에 좋은 코스인 것 같다

대충 감은 잡았으니 이제 알고리즘 차근차근 공부하면서 주제 별로 문제 푸는 연습도 해봐야겠다

밀린 날도 며칠 있었지만 그래도 매일 풀려고 했고 반정도는 성공한듯? 수고했따 더 열심히 하렴

Day24 조건문 활용, 반복문 활용, 이차원 리스트(배열)

  • 커피 심부름
  • 그림 확대
  • 조건에 맞게 수열 변환하기 3
  • l로 만들기
  • 특별한 2차원 배열 1

커피 심부름

문제 설명

팀의 막내인 철수는 아메리카노와 카페 라테만 판매하는 카페에서 팀원들의 커피를 사려고 합니다. 아메리카노와 카페 라테의 가격은 차가운 것과 뜨거운 것 상관없이 각각 4500, 5000원입니다. 각 팀원에게 마실 메뉴를 적어달라고 하였고, 그 중에서 메뉴만 적은 팀원의 것은 차가운 것으로 통일하고 "아무거나"를 적은 팀원의 것은 차가운 아메리카노로 통일하기로 하였습니다.각 직원이 적은 메뉴가 문자열 배열 order로 주어질 때, 카페에서 결제하게 될 금액을 return 하는 solution 함수를 작성해주세요. order의 원소는 아래의 것들만 들어오고, 각각의 의미는 다음과 같습니다.

 

def solution(order):
    answer = 0
    
    for i in order:
        if "latte" in i:
            answer += 5000 
        else:
            answer += 4500
    
    return answer

아이스든 핫이든 상관없이 아메리카노, 아무거나 = 4500 / 라떼 5000

 

이름에 latte 들어가면 +5000원 나머지 +4500


그림 확대

문제 설명

직사각형 형태의 그림 파일이 있고, 이 그림 파일은 1 × 1 크기의 정사각형 크기의 픽셀로 이루어져 있습니다. 이 그림 파일을 나타낸 문자열 배열 picture과 정수 k가 매개변수로 주어질 때, 이 그림 파일을 가로 세로로 k배 늘린 그림 파일을 나타내도록 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

def solution(picture, k):
    answer = []
    for i in picture:
        temp = ''
        
        for j in i:
            temp += j * k
            
        for _ in range(k):
            answer.append(temp)
    return answer

temp에 (문자 * k) 담고 (가로 k배 확대)

temp를 k배 곱한 문자열을 answer에 담는다 (세로 k배대)


조건에 맞게 수열 변환하기 3

문제 설명

정수 배열 arr와 자연수 k가 주어집니다.만약 k가 홀수라면 arr의 모든 원소에 k를 곱하고, k가 짝수라면 arr의 모든 원소에 k를 더합니다.이러한 변환을 마친 후의 arr를 return 하는 solution 함수를 완성해 주세요.

 

def solution(arr, k):
    return  [i * k if k % 2 == 1 else i + k for i in arr ]

k 홀수면, k % 2 == 1 , 모든 arr 원소 * k

k 짝수면 , 모든 arr 원소 + k


l로 만들기

문제 설명

알파벳 소문자로 이루어진 문자열 myString이 주어집니다. 알파벳 순서에서 "l"보다 앞서는 모든 문자를 "l"로 바꾼 문자열을 return 하는 solution 함수를 완성해 주세요.

 

def solution(myString):
    for i in myString:
        if ord(i) < ord('l'):
            myString = myString.replace(i, 'l')
    return myString

replace가 문자열 자체는 변경하지 않으며 바뀐 결과를 반환하기 때문에 바뀐 결과를 유지하고 싶다면 할당해줘야 한다.

할당하지 않고 replace만 썼다가 생각대로 안돼서 오잉.. 함

다른 사람 풀이 보니 굳이 ord로 변환하지 않고 비교해도 된다.

def solution(myString):
    for i in myString:
        if i < 'l':
            myString = myString.replace(i, 'l')
    return myString​

 

아님 그냥 이렇게 깡으로 바꿔버리는 것도 .. 나름 신박한 풀이인듯?

def solution(myString):
    return myString.translate(str.maketrans('abcdefghijk', 'lllllllllll'))

ㅋㅋㅋㅋㅋㅋㅋ


특별한 이차원 배열 1

문제 설명

정수 n이 매개변수로 주어질 때, 다음과 같은 n × n 크기의 이차원 배열 arr를 return 하는 solution 함수를 작성해 주세요.

arr[i][j] (0 ≤ i, j < n)의 값은 i = j라면 1, 아니라면 0입니다.

 

def solution(n):
    answer = [[0]*n for _ in range(n)]

    for i in range(n):
        for j in range(n):
            if i == j:
                answer[i][j] = 1
    return answer

계속 안되길래 애꿏은 포문만 건드렸느데 문제는 배열 정의였다 ..
answer = [[0]*n]*n < 이렇게 했는데 모든 행이 동일한 객체를 참조하고 있어서 계속 틀렸던 ..

그리고 포문을 두번이나 쓸 필요도 없었다 ^^

def solution(n):
    answer = [[0]*n for _ in range(n)]
    
    for i in range(n):
        answer[i][i] = 1
    return answer

이차원 배열 자주 안 다루다 보니 .. 헷갈리네


오 그래도 내일 마지막

Day23 조건문 활용

  • 부분 문자열
  • 꼬리 문자열
  • 정수 찾기
  • 주사위 게임 1
  • 날짜 비교하기

부분 문자열

문제 설명

어떤 문자열 A가 다른 문자열 B안에 속하면 A를 B의 부분 문자열이라고 합니다. 예를 들어 문자열 "abc"는 문자열 "aabcc"의 부분 문자열입니다.문자열 str1과 str2가 주어질 때, str1이 str2의 부분 문자열이라면 1을 부분 문자열이 아니라면 0을 return하도록 solution 함수를 완성해주세요.

 

def solution(str1, str2):
    return int(str1 in str2)

꼬리 문자열

문제 설명

문자열들이 담긴 리스트가 주어졌을 때, 모든 문자열들을 순서대로 합친 문자열을 꼬리 문자열이라고 합니다. 꼬리 문자열을 만들 때 특정 문자열을 포함한 문자열은 제외시키려고 합니다. 예를 들어 문자열 리스트 ["abc", "def", "ghi"]가 있고 문자열 "ef"를 포함한 문자열은 제외하고 꼬리 문자열을 만들면 "abcghi"가 됩니다.
문자열 리스트 str_list와 제외하려는 문자열 ex가 주어질 때, str_list에서 ex를 포함한 문자열을 제외하고 만든 꼬리 문자열을 return하도록 solution 함수를 완성해주세요.

 

def solution(str_list, ex):
    return ''.join([i for i in str_list if ex not in i])

정수 찾기

문제 설명

정수 리스트 num_list와 찾으려는 정수 n이 주어질 때, num_list안에 n이 있으면 1을 없으면 0을 return하도록 solution 함수를 완성해주세요.

 

def solution(num_list, n):
    return int(n in num_list)

주사위 게임 1

문제 설명

1부터 6까지 숫자가 적힌 주사위가 두 개 있습니다. 두 주사위를 굴렸을 때 나온 숫자를 각각 a, b라고 했을 때 얻는 점수는 다음과 같습니다.

a와 b가 모두 홀수라면 a2 + b2 점을 얻습니다.
a와 b 중 하나만 홀수라면 2 × (a + b) 점을 얻습니다.
a와 b 모두 홀수가 아니라면 |a - b| 점을 얻습니다.

두 정수 a와 b가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.

 

def solution(a, b):
    oddA = a % 2 == 1
    oddB = b % 2 == 1

    if oddA and oddB: return a**2 + b**2
    elif oddA or oddB: return 2 * (a + b)
    else: return abs(a-b)

날짜 비교하기

문제 설명

정수 배열 date1과 date2가 주어집니다. 두 배열은 각각 날짜를 나타내며 [year, month, day] 꼴로 주어집니다. 각 배열에서 year는 연도를, month는 월을, day는 날짜를 나타냅니다.만약 date1이 date2보다 앞서는 날짜라면 1을, 아니면 0을 return 하는 solution 함수를 완성해 주세요.
def solution(date1, date2):
    for i in range(3):
        if date1[i] < date2[i]:return 1
        elif date2[i] < date1[i]: return 0
    return 0
def solution(date1, date2):
    return int(date1 < date2)

아 .. 이게되네

Day22 함수(메서드), 조건문 활용

  • 0 떼기
  • 두 수의 합
  • 문자열로 변환
  • 배열의 원소 삭제하기
  • 부분 문자열인지 확인하기

0 떼기

문제 설명

정수로 이루어진 문자열 n_str이 주어질 때, n_str의 가장 왼쪽에 처음으로 등장하는 0들을 뗀 문자열을 return하도록 solution 함수를 완성해주세요.

 

def solution(n_str):
    return str(int(n_str))

 


두 수의 합

문제 설명

0 이상의 두 정수가 문자열 a, b로 주어질 때, a + b의 값을 문자열로 return 하는 solution 함수를 작성해 주세요.

 

def solution(a, b):
    return str(int(a) + int(b))

문자열로 변환

문제 설명

정수 n이 주어질 때, n을 문자열로 변환하여 return하도록 solution 함수를 완성해주세요.

 

def solution(n):
    return str(n)

배열의 원소 삭제하기

문제 설명

정수 배열 arr과 delete_list가 있습니다. arr의 원소 중 delete_list의 원소를 모두 삭제하고 남은 원소들은 기존의 arr에 있던 순서를 유지한 배열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(arr, delete_list):
    answer = []
    for i in arr:
        if i not in delete_list:
            answer.append(i)
    return answer
def solution(arr, delete_list):   
    return [i for i in arr if i not in delete_list]

거의 동일한 코드인데 리스트 컴프리헨션을 사용하여 간편하게


부분 문자열인지 확인하기

문제 설명

부분 문자열이란 문자열에서 연속된 일부분에 해당하는 문자열을 의미합니다. 예를 들어, 문자열 "ana", "ban", "anana", "banana", "n"는 모두 문자열 "banana"의 부분 문자열이지만, "aaa", "bnana", "wxyz"는 모두 "banana"의 부분 문자열이 아닙니다.문자열 my_string과 target이 매개변수로 주어질 때, target이 문자열 my_string의 부분 문자열이라면 1을, 아니라면 0을 return 하는 solution 함수를 작성해 주세요.

def solution(my_string, target):
    return 1 if target in my_string else 0

 

Day21 함수(메서드)

  • 뒤에서 5등 위로
  • 전국 대회 선발 고사
  • 정수 부분
  • 문자열 정수의 합
  • 문자열을 정수로 변환하기

뒤에서 5등 위로

문제 설명

정수로 이루어진 리스트 num_list가 주어집니다. num_list에서 가장 작은 5개의 수를 제외한 수들을 오름차순으로 담은 리스트를 return하도록 solution 함수를 완성해주세요.

 

def solution(num_list):
    return sorted(num_list)[5:]

 


전국 대회 선발 고사

문제 설명

0번부터 n - 1번까지 n명의 학생 중 3명을 선발하는 전국 대회 선발 고사를 보았습니다. 등수가 높은 3명을 선발해야 하지만, 개인 사정으로 전국 대회에 참여하지 못하는 학생들이 있어 참여가 가능한 학생 중 등수가 높은 3명을 선발하기로 했습니다.
각 학생들의 선발 고사 등수를 담은 정수 배열 rank와 전국 대회 참여 가능 여부가 담긴 boolean 배열 attendance가 매개변수로 주어집니다. 전국 대회에 선발된 학생 번호들을 등수가 높은 순서대로 각각 a, b, c번이라고 할 때 10000 × a + 100 × b + c를 return 하는 solution 함수를 작성해 주세요.

 

def solution(rank, attendance):
    answer = 0
    res = [rank[idx] for idx, value in enumerate(attendance) if value == True]
    res = sorted(res)[:3]
    answer = rank.index(res[0]) * 10000 + rank.index(res[1]) * 100 + rank.index(res[2])
    return answer

 


정수 부분

문제 설명

실수 flo가 매개 변수로 주어질 때, flo의 정수 부분을 return하도록 solution 함수를 완성해주세요.

 

def solution(flo):
    return int(flo)

문자열 정수의 합

문제 설명

한 자리 정수로 이루어진 문자열 num_str이 주어질 때, 각 자리수의 합을 return하도록 solution 함수를 완성해주세요.

 

def solution(num_str):
    return eval('+'.join([i for i in num_str]))

eval 함수는 만능인 것 같다. 정석으로 풀자면

def solution(num_str):
    answer = 0
    for i in num_str:
        answer += int(i)
    return answer

 


문자열을 정수로 변환하기

문제 설명

숫자로만 이루어진 문자열 n_str이 주어질 때, n_str을 정수로 변환하여 return하도록 solution 함수를 완성해주세요.

 

def solution(n_str):
    return int(n_str)

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ ???????????


 

Day20  함수(메서드)

  • 배열의 길이를 2의 거듭제곱으로 만들기
  • 배열 비교하기
  • 문자열 묶기
  • 배열의 길이에 따라 다른 연산하기
  • 뒤에서 5등까지

배열의 길이를 2의 거듭제곱으로 만들기

문제 설명

정수 배열 arr이 매개변수로 주어집니다. arr의 길이가 2의 정수 거듭제곱이 되도록 arr 뒤에 정수 0을 추가하려고 합니다. arr에 최소한의 개수로 0을 추가한 배열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(arr):
    int2 = [2**i for i in range(0, 12)]

    while len(arr) not in int2:
        arr.append(0)

    return arr

2의 정수 거듭제곱을 int2에 담아두고

arr의 길이가 정수 거듭제곱과 일치할 때까지 0을 arr에 append


배열 비교하기

문제 설명

이 문제에서 두 정수 배열의 대소관계를 다음과 같이 정의합니다.
1. 두 배열의 길이가 다르다면, 배열의 길이가 긴 쪽이 더 큽니다.
2. 배열의 길이가 같다면 각 배열에 있는 모든 원소의 합을 비교하여 다르다면 더 큰 쪽이 크고, 같다면 같습니다.

두 정수 배열 arr1과 arr2가 주어질 때, 위에서 정의한 배열의 대소관계에 대하여 arr2가 크다면 -1, arr1이 크다면 1, 두 배열이 같다면 0을 return 하는 solution 함수를 작성해 주세요.

 

def solution(arr1, arr2):
    answer = 0
    
    if len(arr1) == len(arr2):
        if sum(arr1) > sum(arr2): return 1
        elif sum(arr1) < sum(arr2): return -1
        else: return 0
                    
    return 1 if len(arr1) > len(arr2) else -1

두 배열의 길이가 다를 때 1 or -1 뿐이니 비교 후 바로 return

두 배열의 길이가 같을 때는 1 or -1 or 0로 3가지 경우가 나오니 if elif else로 비교 후 return


문자열 묶기

문제 설명

문자열 배열 strArr이 주어집니다. strArr의 원소들을 길이가 같은 문자열들끼리 그룹으로 묶었을 때 가장 개수가 많은 그룹의 크기를 return 하는 solution 함수를 완성해 주세요.

제한사항

def solution(strArr):
    answer = 0 
    count = [0] * 31
    for i in strArr:
        count[len(i)] += 1
    return max(count)

원소의 길이의 개수를 저장할 count 배열을 0으로 채워서 만든 후

원소의 길이를 각 배열에 인덱스와 매칭해서 +1씩 더함

처음에 count 배열을 [0] * 30로 해서 계속 실패했음 인덱스는 0부터고 최대길이는 30이니

길이가 30일 때 count[31]에 카운팅되어야 하므로 31까지 생성해주는게 맞음


배열의 길이에 따라 다른 연산하기

문제 설명

정수 배열 arr과 정수 n이 매개변수로 주어집니다.
arr의 길이가 홀수라면 arr의 모든 짝수 인덱스 위치에 n을 더한 배열을,
arr의 길이가 짝수라면 arr의 모든 홀수 인덱스 위치에 n을 더한 배열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(arr, n):
    start = 0 if len(arr) % 2 == 1 else 1
    for i in range(start, len(arr), 2):
        arr[i] += n
    return arr

 

+2씩 증가시키니 start 값에 따라 짝수 인덱스에 더할지, 홀수 인덱스에 더할지가 결정됨, 

포문의 start값을 arr의 길이가 홀수일 때 0, 짝수일 때 1로 지정


뒤에서 5등까지

문제 설명

정수로 이루어진 리스트 num_list가 주어집니다. num_list에서 가장 작은 5개의 수를 오름차순으로 담은 리스트를 return하도록 solution 함수를 완성해주세요.
def solution(num_list):
    answer = sorted(num_list)
    return answer[:5]

정렬 후 5개 슬라이싱

def solution(num_list):
    return sorted(num_list)[:5]​

한 줄이라도 코드 줄이기 


주제가 며칠동안 배열, 리스트였었는데 오늘은 새로운 주제인 함수가 등장했다

어제 어떤 블로그에서 코드를 치면서 계속 고민하는게 아니라 적으면서 답을 찾은 후 코드는 짧게 끝내는 것이라고 했다

그래서 오늘은 끄적이면서 먼저 답을 찾은 후 코드를 쳤는데 뭔가 머릿속으로 정리가 되면서 답을 찾은 느낌이라 더 잘풀리는 듯 했다. 오늘 코드들이 길지는 않은데 헷갈리는 부분들이 있어서 생각보다 오래걸리기도 했지만 그래도 오늘도 성공~

작은 성취감들이 나를 더 단단하게 만든다 후후 20일차 돌파 !!! 

Day19

  • 세 개의 구분자
  • 배열의 원소만큼 추가하기
  • 빈 배열에 추가, 삭제하기
  • 배열 만들기 6
  • 무작위로 K개의 수 뽑기

세 개의 구분자

문제 설명

임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다.예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은 ["onlettu", "etom", "to"] 가 됩니다.문자열 myStr이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며, return할 배열이 빈 배열이라면 ["EMPTY"]를 return 합니다.

 

def solution(myStr):
    answer = []
    value = ''
    for i, v in enumerate(myStr):
        if v == 'a' or v == 'b' or v == 'c':
            if value == '':
                continue
            answer.append(value)
            value = ''
            continue
        else:
            value += v

    if value != '':
        answer.append(value)

    return answer if answer else ['EMPTY']

a, b, c가 아닐 때 value에 문자 하나씩 더하다가 a,b,c를 만나면 value에 저장된 문자열을 answer에 append함

그리고 value는 다시 빈 값, 그렇게 myStr 반복

값은 잘 들어가는데 공백이 포함되어서 첫번째 if 문안에 if문으로 빈 값일 때, continue해주어 해결했다.

 

def solution(myStr):
    answer = [x for x in myStr.replace('a', ' ').replace('b', ' ').replace('c', ' ').split() if x]
    return answer if answer else ['EMPTY']

다른 사람 풀이 : 

a,b,c를 공백으로 대체하고 공백기준으로 split ,, 천재인가 


배열의 원소만큼 추가하기

문제 설명

아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 양의 정수 배열 arr가 매개변수로 주어질 때, arr의 앞에서부터 차례대로 원소를 보면서 원소가 a라면 X의 맨 뒤에 a를 a번 추가하는 일을 반복한 뒤의 배열 X를 return 하는 solution 함수를 작성해 주세요.

 

def solution(arr):
    answer = []
    for i in arr:
        for j in range(i):
            answer.append(i)

    return answer

정석대로 arr의 원소 i를 i번 반복한 값을 answer에 담아 반환

def solution(arr):
    answer = []
    for num in arr:
        answer += [num] * num
    return answer

다른 사람 풀이 : 이중 포문을 쓰지 않은 코드! 성능 면에서 이 코드가 더 깔끔하고 나은듯


빈 배열에 추가, 삭제하기

문제 설명

아무 원소도 들어있지 않은 빈 배열 X가 있습니다. 길이가 같은 정수 배열 arr과 boolean 배열 flag가 매개변수로 주어질 때, flag를 차례대로 순회하며 flag[i]가 true라면 X의 뒤에 arr[i]를 arr[i] × 2 번 추가하고, flag[i]가 false라면 X에서 마지막 arr[i]개의 원소를 제거한 뒤 X를 return 하는 solution 함수를 작성해 주세요.

def solution(arr, flag):
    answer = []
    for i, value in enumerate(flag):
        if value:
            answer += [arr[i]] * arr[i] * 2
        else:
            answer = answer[:-arr[i]]
    return answer

true일 때, arr[i]가 3이면 세 개 출력 후 * 2, 4면 네 개 출력 후 * 2

false일 때 arr[i]의 수만큼 뒤에서 잘라야하니까 거꾸로 슬라이싱 사용

설명을 차근차근? 읽으면 나름 수월하게 풀리는 문제

입출력 예랑 똑같이 나와서 그냥 쾌감 ..요호호


배열 만들기 6

문제 설명

0과 1로만 이루어진 정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk을 만드려고 합니다.i의 초기값을 0으로 설정하고 i가 arr의 길이보다 작으면 다음을 반복합니다.만약 stk이 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.stk에 원소가 있고, stk의 마지막 원소가 arr[i]와 같으면 stk의 마지막 원소를 stk에서 제거하고 i에 1을 더합니다.stk에 원소가 있는데 stk의 마지막 원소가 arr[i]와 다르면 stk의 맨 마지막에 arr[i]를 추가하고 i에 1을 더합니다.위 작업을 마친 후 만들어진 stk을 return 하는 solution 함수를 완성해 주세요.단, 만약 빈 배열을 return 해야한다면 [-1]을 return 합니다.

 

def solution(arr):
    stk = []
    i = 0
    while i < len(arr):
        if stk != [] and stk[-1] == arr[i]:
            stk.pop()
        else: 
            stk.append(arr[i])
        i += 1
    return stk if stk else [-1]

설명에서 조건이 3개로 나누어지는데조건 1, 3번의 실행할 코드는 동일해서 조건을 2가지로 간추려 작성할 수 있었다.

이것도 그냥 설명 잘 따라가면 풀리는 문제


무작위로 K개의 수 뽑

문제 설명

랜덤으로 서로 다른 k개의 수를 저장한 배열을 만드려고 합니다. 적절한 방법이 떠오르지 않기 때문에 일정한 범위 내에서 무작위로 수를 뽑은 후, 지금까지 나온적이 없는 수이면 배열 맨 뒤에 추가하는 방식으로 만들기로 합니다.이미 어떤 수가 무작위로 주어질지 알고 있다고 가정하고, 실제 만들어질 길이 k의 배열을 예상해봅시다.정수 배열 arr가 주어집니다. 문제에서의 무작위의 수는 arr에 저장된 순서대로 주어질 예정이라고 했을 때, 완성될 배열을 return 하는 solution 함수를 완성해 주세요.단, 완성될 배열의 길이가 k보다 작으면 나머지 값을 전부 -1로 채워서 return 합니다.

처음에 짠 코드

테스트 코드는 다 통과하는데 실행 결과에서 다 실패가 뜨는거임

다른 사람들도 보니까 나랑 같은 경우가 많았는데 문제는 set이었다.

설명을 보면 arr에 저장된 순서대로 answer을 반환해야하는데

set을 사용하면 arr 원소의 순서가 바뀌게 될 가능성이 있다는 것

def solution(arr, k):
    answer = []
    newarr = []
    for i in arr:
        if i not in newarr:
            newarr.append(i)

    for i in range(k):
        try:
            answer.append(newarr[i])
        except:
            answer.append(-1)
    return answer

그래서 set을 사용하지 않고, for문을 사용해서 중복제거 된 새로운 배열을 만들었다.

def solution(arr, k):
    ret = []
    for i in arr:
        if i not in ret:
            ret.append(i)
        if len(ret) == k:
            break

    return ret + [-1] * (k - len(ret))

다른 사람 풀이 : 

나는 포문을 두 번 사용했는데 굳이 새로운 배열을 또 만들 필요가 없었다.

배열에 중복되지 않은 원소를 계속 append하다가

배열이 k의 길이와 같아질 때 멈추면 된다.

그리고 만약 배열이 k의 길이보다 짧다면 k의 길이만큼 -1로 채운 값을 리턴한다.


왕 내일 20일차다 대박

Day18 문자열

  • x 사이의 개수
  • 문자열 잘라서 정렬하기
  • 간단한 식 계산하기
  • 문자열 바꿔서 찾기
  • rny_string

x 사이의 개수

문제 설명

문자열 myString이 주어집니다. myString을 문자 "x"를 기준으로 나눴을 때 나눠진 문자열 각각의 길이를 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.

 

def solution(myString):
    answer = [len(i) for i in myString.split('x')]
    return answer

문자열 잘라서 정렬하기

문제 설명

문자열 myString이 주어집니다. "x"를 기준으로 해당 문자열을 잘라내 배열을 만든 후 사전순으로 정렬한 배열을 return 하는 solution 함수를 완성해 주세요.단, 빈 문자열은 반환할 배열에 넣지 않습니다.

 

def solution(myString):
    answer = myString.split('x')
    new = []
    for i in answer:
        if i != "":
            new.append(i)

    return sorted(new)
def solution(myString):
    return sorted(ch for ch in myString.split('x') if ch)

if문으로 원소를 바로 true/false 처리해서 true인 원소들만 정렬하기


간단한 식 계산하기

문제 설명

문자열 binomial이 매개변수로 주어집니다. binomial은 "a op b" 형태의 이항식이고 a와 b는 음이 아닌 정수, op는 '+', '-', '*' 중 하나입니다. 주어진 식을 계산한 정수를 return 하는 solution 함수를 작성해 주세요.

 

def solution(binomial):
    return eval(binomial)

다른 언어 풀이 보면 정석대로 풀긴 했는데 이런거 보면 파이썬 너무 양아치인거 같기도 하고 ...


문자열 바꿔서 찾기

문제 설명

문자 "A"와 "B"로 이루어진 문자열 myString과 pat가 주어집니다. myString의 "A"를 "B"로, "B"를 "A"로 바꾼 문자열의 연속하는 부분 문자열 중 pat이 있으면 1을 아니면 0을 return 하는 solution 함수를 완성하세요.

def solution(s, pat):
    for idx, value in enumerate(s):
        if value == 'A':
            s = s[:idx] + 'B' + s[idx+1:]
        else:
            s = s[:idx] + 'A' + s[idx+1:]
    
    return int(pat in s)

replace를 쓰다가 자꾸 전체가 바뀌어버려서 문자열 연결로 풀었음

def solution(myString, pat):
    return int(pat in myString.replace('A', 'C').replace('B', 'A').replace('C', 'B'))

다른 사람 풀이1: replace로 A를 일단 C로 대체해서 바꾼 것 

def solution(myString, pat):
    return int(''.join(['A' if i == 'B' else 'B' for i in pat]) in myString)

다른 사람 풀이2: myString이 아니라 pat을 이용한 사람도 있다 신박하다

 


rny_string

문제 설명
'm'과 "rn"이 모양이 비슷하게 생긴 점을 활용해 문자열에 장난을 하려고 합니다. 문자열 rny_string이 주어질 때, rny_string의 모든 'm'을 "rn"으로 바꾼 문자열을 return 하는 solution 함수를 작성해 주세요.
def solution(rny_string):
    return rny_string.replace('m', 'rn')

아 난이도를 좀 올려야하나..? 너무 쉬운 곳에 안주하며 머무나 .. 음 일단 기초문제까지는 끝내보자잣

Day17 문자열

  • 특정 문자열로 끝나는 가장 긴 부분 문자열 찾기
  • 문자열이 몇 번 등장하는지 세기
  • ad 제거하기
  • 공백으로 구분하기 1
  • 공백으로 구분하기 2

특정 문자열로 끝나는 가장 긴 부분 문자열 찾기

문제 설명

문자열 myString과 pat가 주어집니다. myString의 부분 문자열중 pat로 끝나는 가장 긴 부분 문자열을 찾아서 return 하는 solution 함수를 완성해 주세요.

 

def solution(myString, pat):
    answer = ''
    idx = 0
    if pat in myString:
        idx = myString.rindex(pat) + len(pat)-1
    answer = myString[:idx+1]
    return answer

myString에서 pat을 찾고 시작 인덱스가 아니라 끝 인덱스를 알아야 하니까 pat의 길이에서 -1 값으로 idx 를 찾았다

이후 처음부터 idx까지 슬라이싱

def solution(myString, pat):
    answer = myString[:myString.rindex(pat) + len(pat)]
    return answer

뭔가 비슷한듯 다른 다른 사람들 풀이가 많아서 내 코드를 수정해봤는데 5-6번째 줄 코드를 합치면

저렇게나 간략해진다. if문 굳이 쓸 필요가 없었다.


문자열이 몇 번 등장하는지 세기

문제 설명

문자열 myString과 pat이 주어집니다. myString에서 pat이 등장하는 횟수를 return 하는 solution 함수를 완성해 주세요.

 

def solution(myString, pat):
    answer = 0
    for i in range(len(myString)):
        if myString[i:i+len(pat)] == pat:
            answer +=1
    return answer

myString을 순회하면서 pat의 길이만큼의 문자열을 pat이랑 비교한 후 일치하면 +1

find랑 rfind로 풀어보려고 했는데 앞, 뒤 제외한 중간에서 겹치는 문자열을 찾을 수가 없어서 포기 ..

def solution(myString, pat):
    answer = 0
    for i, x in enumerate(myString) :
        if myString[i:].startswith(pat) :
            answer += 1
    return answer
startswith() 함수
문자열이 지정된 접두사(prefix)로 시작하는지 여부를 확인하기 위한 파이썬의 문자열 메서드


ad 제거하기

문제 설명

문자열 배열 strArr가 주어집니다. 배열 내의 문자열 중 "ad"라는 부분 문자열을 포함하고 있는 모든 문자열을 제거하고 남은 문자열을 순서를 유지하여 배열로 return 하는 solution 함수를 완성해 주세요.

 

def solution(strArr):
    answer = []
    for idx, value in enumerate(strArr):
        if 'ad' not in value:
            answer.append(strArr[idx])

    return answer

not in 연산자를 사용해서 ad가 없으면 배열 answer에 추가, 있으면 pass


공백으로 구분하기 1

문제 설명

단어가 공백 한 개로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

 

def solution(my_string):
    return my_string.split(' ')

my_string 문자열을 공백으로 구분하여 리스트로 반환

split() 함수
문자열을 특정 구분자(delimiter)를 기준으로 나누어 리스트로 반환하는 파이썬의 문자열 메서드

공백으로 구분하기 2

문제 설명

단어가 공백 한 개 이상으로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요.

def solution(my_string):
    return my_string.split()

응?

 

split(' ')과 split()의 차이는

split(' ')을 사용하면 공백으로 나누다 연속된 공백이 있을 때 공백(빈 문자열)까지 리스트에 포함된다.

split()은 연속된 공백도 하나의 공백으로 간주하여 나눈다.

결론은 공백으로 구분하기1도 split() 사용해도 정답이었음

 

근데 공백으로 구분하기2에는 split(' ') 사용하면 안된다.

연속된 공백이 있으면 공백을 빈 문자열로 배열에 포함하여 리스트를 생성하기 때문


 

+ Recent posts