728x90

pythonanwhere에 배포할 시 위와 같은 오류가 발생하였다.

**.pythonanywhere.com.error.log 를 클릭하면 오류 로그를 볼 수 있다.

보자마자 머리가 아려온다...하지만 꾹 참고 스크롤을 내려보자

왼쪽에 시간을 보니까 아래로 내려갈 수록 최근 로그들 같다.

쭉 내리다가 4월 26일에서 갑자기 28일로 바뀐 로그들이 있다.

그 부분부터 보면 될거같다.

File "/var/www/inab1822_pythonanywhere_com_wsgi.py",

이 부분은 pythonanywhere에 배포하는 방법을 기술해 놓은 다른 사람의 블로그를 보면서 보았던 ~wsgi.py 파일인거 같다.

분명 그 파일을 수정을 해주었는데 수정을 하는 과정에서 오류가 생긴거 같다.

pythonanywhere 페이지 상단의 web 페이지에서

WSGI configuration file: 파일을 눌러 열어보자.

또 한번 많은 텍스트에 머리가 아려오지만 꾹 참고 스크롤을 내려 Django부분을 살펴보자.

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

다른 건 모르겠지만 .settings 는 django 프로젝트를 하며 자주 만지던 settins.py 파일을 말하는 거 같다.

mysite.settings가 느낌상 mysite라는 폴더안의 settings 파일 같은데

내가 하던 프로젝트에는 mysite라는 폴더는 없다.

vscode를 열어 확인해 보니 settings.py는 myapi라는 폴더안에 존재한다.

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapi.settings'

그럼 mysite를 myapi로 바꾸어 보자.

728x90
728x90

flutter doctor --android-licenses 을 입력하니 위와 같은 오류가 떴다.

아무리 찾아봐도 해결이 안되길래 이것저것 해보다가

위와 같은 사지을 발견하고 맨 위의 사진에서

this version of the Java Runtime only recognizes class file versions up to 52.0

52.0 버전에서만 돌아간다고 한다.

그럼 두번째 사진에서

JAVA 8을 써야한다는 말인거 같다(비전공자라 자세한건 모름)

Android Studio를 실행하자

왼쪽 위 톱니바퀴 모양 > Settings... > System Settings > Android ADK 에서

SDK Tools를 누르면

위와 같은 화면이 뜬다.

여기서 진짜 모든 포스팅에서 위 사진을 설치하면 된다하는데 나는 도저히 안되더라 그럼 어떻게 하냐?

아래에 Show Package Details 체크박스를 누르면 Android SDK Command-line tools 밑으로 여러가지 버전이 나온다

여기서 지금은 이미 8.0 버전이 체크되어 있지만 처음엔 맨 위에있는 lastst인 9.0버전만 체크되어 있었다.

위 사진에서 JAVA8을 써야한 다는 말을 알았으니 8.0버전을 체크하여 설치해주자

아주 잘된다... 솔직히 저게 맞는 방법인지는 모르겠다..

아시는 분 있으면 알려주세요...
728x90

'트러블슈팅(troubleshooting)' 카테고리의 다른 글

[pythonanywhere] Something went wrong :-(  (0) 2023.04.28
728x90

문제 설명

  • 어느 학교에 페인트가 칠해진 길이가 n미터인 벽이 있습니다. 벽에 동아리 · 학회 홍보나 회사 채용 공고 포스터 등을 게시하기 위해 테이프로 붙였다가 철거할 때 떼는 일이 많고 그 과정에서 페인트가 벗겨지곤 합니다. 페인트가 벗겨진 벽이 보기 흉해져 학교는 벽에 페인트를 덧칠하기로 했습니다.
  • 넓은 벽 전체에 페인트를 새로 칠하는 대신, 구역을 나누어 일부만 페인트를 새로 칠 함으로써 예산을 아끼려 합니다. 이를 위해 벽을 1미터 길이의 구역 n개로 나누고, 각 구역에 왼쪽부터 순서대로 1번부터 n번까지 번호를 붙였습니다. 그리고 페인트를 다시 칠해야 할 구역들을 정했습니다.
  • 벽에 페인트를 칠하는 롤러의 길이는 m미터이고, 롤러로 벽에 페인트를 한 번 칠하는 규칙은 다음과 같습니다.
    • 롤러가 벽에서 벗어나면 안 됩니다.
    • 구역의 일부분만 포함되도록 칠하면 안 됩니다.
  • 즉, 롤러의 좌우측 끝을 구역의 경계선 혹은 벽의 좌우측 끝부분에 맞춘 후 롤러를 위아래로 움직이면서 벽을 칠합니다. 현재 페인트를 칠하는 구역들을 완전히 칠한 후 벽에서 롤러를 떼며, 이를 벽을 한 번 칠했다고 정의합니다.
  • 한 구역에 페인트를 여러 번 칠해도 되고 다시 칠해야 할 구역이 아닌 곳에 페인트를 칠해도 되지만 다시 칠하기로 정한 구역은 적어도 한 번 페인트칠을 해야 합니다. 예산을 아끼기 위해 다시 칠할 구역을 정했듯 마찬가지로 롤러로 페인트칠을 하는 횟수를 최소화하려고 합니다.
  • 정수 n, m과 다시 페인트를 칠하기로 정한 구역들의 번호가 담긴 정수 배열 section이 매개변수로 주어질 때 롤러로 페인트칠해야 하는 최소 횟수를 return 하는 solution 함수를 작성해 주세요.

제한사항

  • 1 ≤ m ≤ n ≤ 100,000
  • 1 ≤ section의 길이 ≤ n
  • 1 ≤ section의 원소 ≤ n
    • section의 원소는 페인트를 다시 칠해야 하는 구역의 번호입니다.
    • section에서 같은 원소가 두 번 이상 나타나지 않습니다.
    • section의 원소는 오름차순으로 정렬되어 있습니다.

n = 8
m = 4
section = [2,3,6]
# result = 2
def solution(n, m, section):
    answer = 0
    
    # n개의 벽을 하나하나 보기 보다는
    # section은 칠해야 할 벽을 작은 수 부터 정렬해 놓았으니
    # section의 맨 첫 번째 값에 해당하는 벽 부터 시작하면 된다.
    # sectio의 첫번째 값에 1을 뺀 후 frist_num에 저장
    first_num = section[0] -1
    
    # section의 요소들을 하나하나 살펴보며
    for num in section:
        
        # 만약 first_num의 값이 section의 요소 중 하나인 num 보다 작으면
        if first_num < num:
            
            # num에 롤러의 길의 -1 값을 더한다.
            # 이는 section의 값에 해당하는 위치의 벽만 살펴 보겠다는 의미이다.
            # 앞에 수만은 벽이 있어도 section에 해당하는 즉 다시 칠할 벽 부분 만 본다는 뜻이다.
            # 아래의 식을 수행하면 first_num은 num에서 롤러의 길이 만큼의 벽에 도달한다.
            first_num = num+m-1
            # 그리고 벽을 칠했으니 answer에 1을 더한다.
            answer += 1
            
            # 다시 for 문으로 돌아가면 롤러로 칠한 끝 부분부터 시작한다.
    return answer
    
    # 함수를 실행 해 보자.
    solution(n, m, section)
    # 2 가 출력된다.
728x90
728x90

비전공자로서 6개월간 python 빅데이터 관련 국비지원

수업을 들은 후 정보처리기사 자격증을 준비했다.

 

접수일은 23년 1월 16일... 

하지만 막상 공부는 2월 부터 시작했다.

총 한달반 정도 걸린거 같다.

 

 

 

책은 시나공과 수제비 중 고민하였는데

비전공자는 수제비가 더 편하다고 해서

수제비를 선택하였다.

 

다른 사람들은 수제비의 두음법칙 공부법이 좋다 했는데

나는 솔직히 모르겠다.

 

두음법칙이 너무 많아서 오히려 했갈림...

처음 나오는 몇개만 외우고 

나머지는 그냥 읽고 이해하면서 외운거 같다.

한 2 - 3 단원 공부하던 중 너무 지루해서

전자문제집 cbt랑 병행했는데

거진 cbt가 주였고

틀린 문제나 모호한 문제 완벽히 이해하지 못한 문제를

하나하나 수제비 책에서 찾아서 

보는 식으로 공부했다.

그리고 cbt에 로그인 하면

자기  푼 문제들 오답노트도 볼 수 있으니

거의 필수라고 생각한다.

 

공부 시간은 평일에만 4시간 씩...

이었지만 점차 그냥 매일 cbt풀고

틀린거 애매한거 책 찾아서 보고

한번씩 하고 끝냈던거 같다.

 

그러다 보니 점점 문제푸는 속도도 줄어들고

틀리는 문제도 적어지다 보니

하루에 한시간씩 밖에 안한거같다...

(나중에는 보기만 보고도 문제를 풀 수 있게 되더라...)

 

 

 

바아아로 합격!!!~~~

 

 

시험당일날 cbt에 나온 문제들이

그렇게 많이 나오지는 않은 것 같다.

오답풀이 하면서 자주 보다보니

관련 문제들을 쉽게 푼 것 같았다.

 

하지만 python만 할 줄 알아서 그런지

java, c 관련 문제들은 어려웠음.

 

 

 

이제 실기 준비하러 가야지...

다들 화이팅!

728x90
728x90

문제 설명

  • 머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ babbling의 길이 ≤ 100
  • 1 ≤ babbling[i]의 길이 ≤ 30
  • 문자열은 알파벳 소문자로만 이루어져 있습니다.
# 입출력 예
babbling = ["ayaye", "uuu", "yeye", "yemawoo", "ayaayaa"]
babbling1 = ["aya", "yee", "u", "maa"]
def solution(babbling):


    # 머쓱이가 낼 수 있는 옹알이를 words에 리스트로 넣어놓는다.
    words= ["aya", "ye", "woo", "ma"]

    answer = 0
    # for문으로 babbling안에 있는 문자열 하나하나를 babbl에 저장한다.
    for babbl in babbling:
        # words에 있는 요소 하나하나를 word에 저장한다.
        for word in words:
            # 문제에서 연속해서 같은 발음을 하는 것은 불가능하기에
            # word가 두번 babbl에 들어가지 않으면
            if word*2 not in babbl:
                # babbl에 word부분을 " "으로 replace한다.
                babbl = babbl.replace(word," ")
        # 그 후 babbl에 있는 모든 공백을 strip으로 날리고 "" 와 같아지면
        if babbl.strip() == "":
            # answer에 1을 더한다.
            answer +=1
    return answer
print(solution(babbling))
print(solution(babbling1))

# 2
# 1

다른 사람의 풀이

def solution(babbling):
    count = 0
    
    # babbling에 있는 문자열 하나한를 b에 저장해 살펴본다.
    for b in babbling:
        # 만약 "aya", "ye", "woo", "ma" 들이 두번 연속 해서 나오지 않는다면 계속
        if "ayaaya" in b or "yeye" in b or "woowoo" in b or "mama" in b:
            continue
        # 만약 "aya", "ye", "woo", "ma" 문자열 모두 공백으로 replace한 후 공백을 없애 버리면 False가 됨
        # not을 붙여 반대로 True로 만들어 진다면
        if not b.replace("aya", " ").replace("ye", " ").replace("woo", " ").replace("ma", " ").replace(" ", ""):
            # count에 1 추가
            count += 1

    return count
728x90
728x90

문제 설명

  • 코딩테스트를 준비하는 머쓱이는 프로그래머스에서 문제를 풀고 나중에 다시 코드를 보면서 공부하려고 작성한 코드를 컴퓨터 바탕화면에 아무 위치에나 저장해 둡니다. 저장한 코드가 많아지면서 머쓱이는 본인의 컴퓨터 바탕화면이 너무 지저분하다고 생각했습니다. 프로그래머스에서 작성했던 코드는 그 문제에 가서 다시 볼 수 있기 때문에 저장해 둔 파일들을 전부 삭제하기로 했습니다.
  • 컴퓨터 바탕화면은 각 칸이 정사각형인 격자판입니다. 이때 컴퓨터 바탕화면의 상태를 나타낸 문자열 배열 wallpaper가 주어집니다. 파일들은 바탕화면의 격자칸에 위치하고 바탕화면의 격자점들은 바탕화면의 가장 왼쪽 위를 (0, 0)으로 시작해 (세로 좌표, 가로 좌표)로 표현합니다. 빈칸은 ".", 파일이 있는 칸은 "#"의 값을 가집니다. 드래그를 하면 파일들을 선택할 수 있고, 선택된 파일들을 삭제할 수 있습니다. 머쓱이는 최소한의 이동거리를 갖는 한 번의 드래그로 모든 파일을 선택해서 한 번에 지우려고 하며 드래그로 파일들을 선택하는 방법은 다음과 같습니다.
    • 드래그는 바탕화면의 격자점 S(lux, luy)를 마우스 왼쪽 버튼으로 클릭한 상태로 격자점 E(rdx, rdy)로 이동한 뒤 마우스 왼쪽 버튼을 떼는 행동입니다. 이때, "점 S에서 점 E로 드래그한다"고 표현하고 점 S와 점 E를 각각 드래그의 시작점, 끝점이라고 표현합니다.
    • 점 S(lux, luy)에서 점 E(rdx, rdy)로 드래그를 할 때, "드래그 한 거리"는 |rdx - lux| + |rdy - luy|로 정의합니다.
    • 점 S에서 점 E로 드래그를 하면 바탕화면에서 두 격자점을 각각 왼쪽 위, 오른쪽 아래로 하는 직사각형 내부에 있는 모든 파일이 선택됩니다.
  • 예를 들어 wallpaper = [".#...", "..#..", "...#."]인 바탕화면을 그림으로 나타내면 다음과 같습니다.

  • 이러한 바탕화면에서 다음 그림과 같이 S(0, 1)에서 E(3, 4)로 드래그하면 세 개의 파일이 모두 선택되므로 드래그 한 거리 (3 - 0) + (4 - 1) = 6을 최솟값으로 모든 파일을 선택 가능합니다.

  • (0, 0)에서 (3, 5)로 드래그해도 모든 파일을 선택할 수 있지만 이때 드래그 한 거리는 (3 - 0) + (5 - 0) = 8이고 이전의 방법보다 거리가 늘어납니다.
  • 머쓱이의 컴퓨터 바탕화면의 상태를 나타내는 문자열 배열 wallpaper가 매개변수로 주어질 때 바탕화면의 파일들을 한 번에 삭제하기 위해 최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 담은 정수 배열을 return하는 solution 함수를 작성해 주세요. 드래그의 시작점이 (lux, luy), 끝점이 (rdx, rdy)라면 정수 배열 [lux, luy, rdx, rdy]를 return하면 됩니다.

제한사항

  • 1 ≤ wallpaper의 길이 ≤ 50
  • 1 ≤ wallpaper[i]의 길이 ≤ 50
    • wallpaper의 모든 원소의 길이는 동일합니다.
  • wallpaper[i][j]는 바탕화면에서 i + 1j + 1열에 해당하는 칸의 상태를 나타냅니다.
  • wallpaper[i][j]는 "#" 또는 "."의 값만 가집니다.
  • 바탕화면에는 적어도 하나의 파일이 있습니다.
  • 드래그 시작점 (lux, luy)와 끝점 (rdx, rdy)는 lux < rdx, luy < rdy를 만족해야 합니다.
wallpaper = ["..........", ".....#....", "......##..", "...##.....", "....#....."]
wallpaper1 = [".#...", "..#..", "...#."]
wallpaper2 = [".##...##.", "#..#.#..#", "#...#...#", ".#.....#.", "..#...#..", "...#.#...", "....#...."]
def solution(wallpaper):

    # 시작지점의 x,y point와
    # 끝지점의 x,y point를 각각 변수를 만들어 할당한다.
    s_y_point = len(wallpaper) # 시작지점의 x와 y에는 가장 끝 지점의 좌표를 입력
    s_x_point = len(wallpaper[0])
    e_y_point = 0 # 끝지점의 x와 y에는 0을 입력
    e_x_point = 0

    # 이중 포문으로 각 요소를 하나하나 살펴본다.
    for i in range(len(wallpaper)):
        for j in range(len(wallpaper[i])):

            # 만약 wallpaper[i][j]가 '#'이고 i가 s_y_point보다 작으면 
            if (wallpaper[i][j] == '#') and (i < s_y_point):
                # s_y_point에 i를 저장
                s_y_point = i
            # 만약 wallpaper[i][j]가 '#'이고 j가 s_x_point보다 작으면
            if (wallpaper[i][j] == '#') and (j < s_x_point):
                # s_x_point에 j를 저장
                s_x_point = j
            # 만약 wallpaper[i][j]가 '#'이고 i가 e_y_point보다 크면
            if (wallpaper[i][j] == '#') and (i > e_y_point):
                # e_y_point에 i를 저장
                e_y_point = i
            # 만약 wallpaper[i][j]가 '#'이고 j가 e_y_point보다 크면
            if (wallpaper[i][j] == '#') and (j > e_x_point):
                # e_x_point에 j를 저장
                e_x_point = j
    return [s_y_point, s_x_point, e_y_point+1,e_x_point+1]
print(solution(wallpaper))
print(solution(wallpaper1))
print(solution(wallpaper2))

# [1, 3, 5, 8]
# [0, 1, 3, 4]
# [0, 0, 7, 9]

다른 사람의 풀이

def solution(wall):
    
    # a와 b라는 빈 리스트를 만든다.
    a, b = [], []
    
    # wall안에있는 모든 문자열요소를 하나하나 살펴본다.
    for i in range(len(wall)):
        for j in range(len(wall[i])):
            
            # 만약 wall[i][j]가 '#'이면
            if wall[i][j] == "#":
                # 그 때의 i값을 a에 마지막 요소로 넣고
                a.append(i)
                # 그 때의 j값을 b에 마지막 요소로 넣는다.
                b.append(j)
    # 그리고 a의 최소값, b의 최소값, a의 최대값+1, b의 최대값 +1을 반환한다.
    return [min(a), min(b), max(a) + 1, max(b) + 1]
print(solution(wallpaper))
print(solution(wallpaper1))
print(solution(wallpaper2))

# [1, 3, 5, 8]
# [0, 1, 3, 4]
# [0, 0, 7, 9]

 

728x90
728x90

문제 설명

  • 수웅이는 매달 주어진 음식을 빨리 먹는 푸드 파이트 대회를 개최합니다. 이 대회에서 선수들은 1대 1로 대결하며, 매 대결마다 음식의 종류와 양이 바뀝니다. 대결은 준비된 음식들을 일렬로 배치한 뒤, 한 선수는 제일 왼쪽에 있는 음식부터 오른쪽으로, 다른 선수는 제일 오른쪽에 있는 음식부터 왼쪽으로 순서대로 먹는 방식으로 진행됩니다. 중앙에는 물을 배치하고, 물을 먼저 먹는 선수가 승리하게 됩니다.
  • 이때, 대회의 공정성을 위해 두 선수가 먹는 음식의 종류와 양이 같아야 하며, 음식을 먹는 순서도 같아야 합니다. 또한, 이번 대회부터는 칼로리가 낮은 음식을 먼저 먹을 수 있게 배치하여 선수들이 음식을 더 잘 먹을 수 있게 하려고 합니다. 이번 대회를 위해 수웅이는 음식을 주문했는데, 대회의 조건을 고려하지 않고 음식을 주문하여 몇 개의 음식은 대회에 사용하지 못하게 되었습니다.
  • 예를 들어, 3가지의 음식이 준비되어 있으며, 칼로리가 적은 순서대로 1번 음식을 3개, 2번 음식을 4개, 3번 음식을 6개 준비했으며, 물을 편의상 0번 음식이라고 칭한다면, 두 선수는 1번 음식 1개, 2번 음식 2개, 3번 음식 3개씩을 먹게 되므로 음식의 배치는 "1223330333221"이 됩니다. 따라서 1번 음식 1개는 대회에 사용하지 못합니다.
  • 수웅이가 준비한 음식의 양을 칼로리가 적은 순서대로 나타내는 정수 배열 food가 주어졌을 때, 대회를 위한 음식의 배치를 나타내는 문자열을 return 하는 solution 함수를 완성해주세요.

제한사항

  • 2 ≤ food의 길이 ≤ 9
  • 1 ≤ food의 각 원소 ≤ 1,000
  • food에는 칼로리가 적은 순서대로 음식의 양이 담겨 있습니다.
  • food[i]는 i번 음식의 수입니다.
  • food[0]은 수웅이가 준비한 물의 양이며, 항상 1입니다.
  • 정답의 길이가 3 이상인 경우만 입력으로 주어집니다.

food1 = [1, 3, 4, 6] # "1223330333221"
food2 = [1, 7, 1, 2] # "111303111"
food3 = [1, 3, 2, 3] # "1230123"
def solution(food):
    # 답을 넣을 asnwer을 만든다.
    answer = ''

    # enumerate를 사용하면 food의 각 요소와 해당요소의 인덱스 값을 반환한다.
    # 이때 맨 앞의 1은 물을 뜻하므로 0으로 무조건 반환해야 하기에 food[1:]로 빼고
    # for문을 돌린다. food1 = [1, 3, 4, 6] 을 예로 들면,
    # idx, num 값은 차례대로 (0,3),(1,4),(2,6)이 들어간다.
    for idx, num in enumerate(food[1:]):

        # num//2 range만큼 다시 for문을 돌린다.
        # 3, 4, 6 을 2로 나눈 몫 -> 1, 2, 3 range만큼 반복될 것이다.
        for i in range(num//2):

            # asnwer에 idx 즉 인덱스 값에 1을 더한 값을 집어 넣는다.
            # 1이 한번 2가 두번 3이 세번 들어갈 것이다.
            answer += str(idx+1)

    # anwer값에 0을 더한 후 answer를 반전시킨 문자열을 더한다.    
    return answer + '0'+answer[::-1]
print(solution(food1))
print(solution(food2))
print(solution(food3))

# 1223330333221
# 111303111
# 1230321

다른 사람의 풀이

def solution(food):
    # '0'을 가지고있는 문자열 answer을 만든다.
    answer ="0"
    
    # food의 길이-1부터 0까지 거꾸로 살펴보며 for문을 돌린다.
    # food1 = [1, 3, 4, 6] 을 예시로 들면 i에는 3, 2, 1이 차례대로 들어간다.
    for i in range(len(food)-1, 0,-1):
        
        # food의 i번째의 요소를 2로 나눈 후 int를 씌워주면 소수점이 날라간다.
        # 이 때 c에는 3, 2, 1 이 차례대로 할당된다.
        c = int(food[i]/2)
        
        # 각 c가 0이되면 멈추는 while문이다.
        while c>0:
            # 기존의 answer에 '0'이 있다.
            # 여기 앞과 뒤에 문자열 i를 넣은 값을 다시 answer에 할당한다.
            answer = str(i) + answer + str(i)
            # c에 1을 뺀 후 다시 while문을 돌린다.
            c -= 1
    return answer
print(solution(food1))
print(solution(food2))
print(solution(food3))

# 1223330333221
# 111303111
# 1230321
728x90
728x90

문제 설명

  • 햄버거 가게에서 일을 하는 상수는 햄버거를 포장하는 일을 합니다. 함께 일을 하는 다른 직원들이 햄버거에 들어갈 재료를 조리해 주면 조리된 순서대로 상수의 앞에 아래서부터 위로 쌓이게 되고, 상수는 순서에 맞게 쌓여서 완성된 햄버거를 따로 옮겨 포장을 하게 됩니다. 상수가 일하는 가게는 정해진 순서(아래서부터, 빵 – 야채 – 고기 - 빵)로 쌓인 햄버거만 포장을 합니다. 상수는 손이 굉장히 빠르기 때문에 상수가 포장하는 동안 속 재료가 추가적으로 들어오는 일은 없으며, 재료의 높이는 무시하여 재료가 높이 쌓여서 일이 힘들어지는 경우는 없습니다.
  • 예를 들어, 상수의 앞에 쌓이는 재료의 순서가 [야채, 빵, 빵, 야채, 고기, 빵, 야채, 고기, 빵]일 때, 상수는 여섯 번째 재료가 쌓였을 때, 세 번째 재료부터 여섯 번째 재료를 이용하여 햄버거를 포장하고, 아홉 번째 재료가 쌓였을 때, 두 번째 재료와 일곱 번째 재료부터 아홉 번째 재료를 이용하여 햄버거를 포장합니다. 즉, 2개의 햄버거를 포장하게 됩니다.
  • 상수에게 전해지는 재료의 정보를 나타내는 정수 배열 ingredient가 주어졌을 때, 상수가 포장하는 햄버거의 개수를 return 하도록 solution 함수를 완성하시오.

제한사항

  • 1 ≤ ingredient의 길이 ≤ 1,000,000
  • ingredient의 원소는 1, 2, 3 중 하나의 값이며, 순서대로 빵, 야채, 고기를 의미합니다.
ingredient = [2, 1, 1, 2, 3, 1, 2, 3, 1]

def solution(ingredient):
    pack = True
    answer = 0
    result = 0

    # pack가 True일 때만 실행한다.
    while pack:

        # ingredient의 길이만큼 for문을 돌린다.
        for i in range(len(ingredient)):
            # 만약 ingredient[i:i+4] 값이 [1,2,3,1] 이면
            if ingredient[i:i+4] == [1,2,3,1]:
                # 해당 ingredient[i:i+4] 을 리스트에서 지워버리고
                del ingredient[i:i+4]
                # result에 1을 더한 후
                result += 1
                # 해당 i 인덱스에 0을 집어넣는다.
                ingredient.insert(i,0)

        # 그리고 answer와 result의 값이 같으면
        # 즉 더 [1,2,3,1]을 찾지 못하면
        if answer == result:   
            # pack를 False로 바꾸고 while문을 끝낸다.
            pack = False
        # 아니라면
        # 즉 [1,2,3,1]을 더 찾았다면
        elif answer != result:
            # ingredient에 넣은 0을 빼주고
            ingredient = [i for i in ingredient if i != 0]
            # result 값을 answer에 할당한다.
            answer = result

    return answer

    solution(ingredient)
    # 2

3~6, 9, 12문제에 계속 실패가 뜬다....결국 반례를 찾아보고 다른 사람의 풀이를 살펴보았다.

반례를 찾아보니

  • 만약 ingredient가 [...1,2,1,2,3,1,3,1,....] 이라면
  • 중간에 [...1,2,[1,2,3,1],3,1,....] 을 빼면 [...1,2,3,1,]이 또 만들어진다.
  • 이때 또 만들어진 [1,2,3,1]을 찾아내야 되는데
  • 위에 짠 코드에는 그냥 다음으로 넘어가 버린다.
# 위의 반례를 예시로 들어 아래의 ingredient 변수를 만든다.
ingredient = [1,1,2,2,3,1, 1,2, 1, 2, 3, 1, 3, 1, 2, 3, 1]
# 3이 나와야한다.

def solution(ingredient):
    answer = 0
    i = 0

    # i 가 ingredient의 길이보다 같거나 작은한 계속 while을 돌린다.
    while i <= len(ingredient):
        # 만약 ingredient[i:i+4]에 해당하는 리스트 값이 [1,2,3,1] 이면
        if ingredient[i:i+4] == [1,2,3,1]:
            # 해당 ingredient[i:i+4]을 ingredient에서 삭제한다.
            del ingredient[i:i+4]
            # answer에 1을 더한다.
            answer += 1
            # 그리고 i에 3을 뺀 값을 i에 저장한다.
            # 이때 i는 인덱스값으로 쓰이기에 3칸 만큼 뒤로 간다는 뜻이다
            i = i - 3
        # 그 후에 마치 for문을 돌리듯이 다음 i 인덱스를 살펴본다.
        i += 1

    return answer

    solution(ingredient)

    # 3

다른 사람의 풀이

ingredient = [1,1,2,2,3,1, 1,2, 1, 2, 3, 1, 3, 1, 2, 3, 1]

def solution(ingredient):
    
    # 리스트 s와 값이 0인 cnt를 만든다.
    s = []
    cnt = 0
    
    # ingredient의 요소 하나하나를 살펴보자.
    for i in ingredient:
        # 해당 i를 리스트 s에 마지막 요소로 집어넣는다.
        s.append(i)
        # 이때 만약 리스트 s의 맨 뒤에서 네번째 부터 맨 뒤의 요소가
        # [1, 2, 3, 1] 리스트의 값을 가지면
        if s[-4:] == [1, 2, 3, 1]:
            # cnt를 1 더해준고
            cnt += 1
            # pop()으로 s의 맨 마지막 요소를
            # 4번 반복하여 빼 낸다.
            for i in range(4):
                s.pop()
    return cnt
    
    solution(ingredient)
    
    # 3
728x90

+ Recent posts