완주하지 못한 선수 (Python)

0. 출처

1. 기록

  • 22/04/13 (수)

2. 풀이

(1) 아이디어

1. 아이디어
>> 정렬 후 비교해서
>> 다른 경우가 생기는 경우를 return 한다.

2. 시간복잡도
>>

3. 자료구조
>>

(2) 코드

# 풀이1 : 리스트 정렬

def solution(participant, completion):
    p = sorted(participant)
    c = sorted(completion)

    for i in range(0, len(completion)):
        if p[i] != c[i]:
            return p[i]

    return p[-1]
# 풀이2 : hash 이용

def solution(participant, completion):
    hashDict = {}
    sumHash = 0
    # 1. Hash : Participant의 dictionary 만들기
    # 2. Participant의 sum(hash) 구하기
    for part in participant:
        hashDict[hash(part)] = part
        print(hashDict)
        sumHash += hash(part)

    # 3. completion의 sum(hash) 빼기
    for comp in completion:
        sumHash -= hash(comp)

    # 4. 남은 값이 완주하지 못한 선수의 hash 값이 된다
    return hashDict[sumHash]
# 풀이3 : counter 이용

import collections

def solution(participant, completion):
    # 1. participant의 Counter를 구한다
    # 2. completion의 Counter를 구한다
    # 3. 둘의 차를 구하면 정답만 남아있는 counter를 반환한다
    answer = collections.Counter(participant) - collections.Counter(completion)

    # 4. counter의 key값을 반환한다
    return list(answer.keys())[0]

(3) 정리

(4) 참고

참고 풀이
참고 영상

18430_[문제이름] (Python)

0. 출처

1. 기록

  • 22/04/11 (월)

2. 풀이

(1) 아이디어, 시간복잡도, 자료구조

1. 아이디어
>> 특정 3칸을 차지하면 나머지 칸에서 ㄱ or ㄴ 형태로 3칸을 차지하는 모든 경우를 체크해서 
>> 문제에서 요구하는 사항에 맞는 최댓값을 갱신시킨다.
>> 특정 3칸을 이동하고 다시 반복
>> 특정 3칸 ㄱ or ㄴ 형태를 어떻게 입력시킬 것인지?
>> ┌, ┐, └, ┘ 각 4가지 모양을 기준으로 위의 로직을 반복한다.

2. 시간복잡도
>>

3. 자료구조
>>

(2) 예제 입력, 예제 출력

- 예제 입력 1 -
3 3
32 83 75
24 96 56
71 88 12

- 예제 출력 1 -
632

- 예제 입력 2 -
1 1
7

- 예제 출력 2 -
0

(3) 코드

# (0,0)부터 시작
# 시작점을 방문안했으면
#   부메랑 블럭이 범위 안에 있고, 방문안했으면 --> 강도 계산
# 시작점을 방문했으면
#   시작점 = 한칸 옆
def first(y, x):
    return woods[y][x-1] + 2*woods[y][x] + woods[y-1][x]


def second(y, x):
    return woods[y][x-1] + 2*woods[y][x] + woods[y+1][x]


def third(y, x):
    return woods[y+1][x] + 2*woods[y][x] + woods[y][x+1]


def fourth(y, x):
    return woods[y-1][x] + 2*woods[y][x] + woods[y][x+1]


def solve(y, x, strength):
    global N, M, answer
    if x == M:
        x = 0
        y += 1
    if y == N:
        answer = max(answer, strength)
        return
    if not visited[y][x]:
        if y - 1 >= 0 and x - 1 >= 0 and not visited[y][x-1] and not visited[y-1][x]:
            visited[y][x] = visited[y][x-1] = visited[y-1][x] = True
            this_strength = strength + first(y, x)
            solve(y, x+1, this_strength)
            visited[y][x] = visited[y][x-1] = visited[y-1][x] = False
        if y + 1 < N and x - 1 >= 0 and not visited[y+1][x] and not visited[y][x-1]:
            visited[y][x] = visited[y][x-1] = visited[y+1][x] = True
            this_strength = strength + second(y, x)
            solve(y, x+1, this_strength)
            visited[y][x] = visited[y][x-1] = visited[y+1][x] = False
        if y + 1 < N and x + 1 < M and not visited[y+1][x] and not visited[y][x+1]:
            visited[y][x] = visited[y][x+1] = visited[y+1][x] = True
            this_strength = strength + third(y, x)
            solve(y, x+1, this_strength)
            visited[y][x] = visited[y][x+1] = visited[y+1][x] = False
        if y - 1 >= 0 and x + 1 < M and not visited[y-1][x] and not visited[y][x+1]:
            visited[y][x] = visited[y][x+1] = visited[y-1][x] = True
            this_strength = strength + fourth(y, x)
            solve(y, x+1, this_strength)
            visited[y][x] = visited[y][x+1] = visited[y-1][x] = False
    solve(y, x+1, strength)


N, M = map(int, input().split())
woods = [list(map(int, input().split())) for _ in range(N)]
visited = [[False] * M for _ in range(N)]
answer = 0
solve(0, 0, 0)
print(answer)

(4) 정리

아이디어는 맞았으나 구현을 제대로 못해 해답을 찾아본 문제입니다.
구체적으로 visited 등에 ┌, ┐, └, ┘등 각 모양을 체크 후 재귀를 구현하는걸 세세히 코드화시키지 못하였습니다.
구현력 기르는 연습을 계속해야할 듯 합니다.

(5) 참고

참고 풀이1
참고 풀이2
참고 풀이3

1174__줄어드는 수 (Python)

0. 출처

1. 기록

  • 22/04/10 (일)

2. 풀이

(1) 아이디어, 시간복잡도, 자료구조

1. 아이디어
>> 예제 입력과 예제 출력을 보고 뭔말인지 도저히 모르겠음
>> 문제 이해 함
>> 문제 조건에 맞는 1번째로 가장 작은수는 0
>> 2번째로 가장 작은 수는 1
>> 3번째로 가장 작은 수는 2
>> ...
>> 10번째로 가장 작은 수는 9
>> 11번째로 가장 작은 수는 10
>> 12번째로 가장 작은 수는 20

>> 그래서 어떻게 풀건데? 
>> 마지막 값 > 현재 값 경우, 재귀 진행하여 감소하는 수를 만들어 준다.
>> 감소하는 수를 정렬한다.

2. 시간복잡도
>>

3. 자료구조
>>

(2) 예제 입력, 예제 출력

- 예제 입력 1 -
sample

- 예제 출력 1 -
sample

(3) 코드

n = input()
arr = list()
result = list()

def dfs():
    if len(arr) > 0:
        result.append(int("".join(map(str, arr))))

    for i in range(0, 10):
        if len(arr) == 0 or arr[-1] > i:  # 마지막 값이 더 큰 경우
            arr.append(i)
            print(arr)
            dfs()
            arr.pop()

try:
    dfs()
    result.sort()
    print(result[n - 1])
except:
    print(-1)

(4) 정리

처음에 문제가 이해가 안가서 답안 코드에 1부터 하나하나 집어넣고 이해했다.

문제 이해력을 길러야겠다.

(5) 참고

참고 풀이

1. 서류

따로 서류 제출은 없고 프로그래머스에서 신청만하면 코딩 테스트를 볼 수 있습니다.

2. 안내 메일

사진처럼 메일이 오고 기재된 날짜 내에 테스트를 치루기만 하면 됩니다.
안내대로 사전등록 과정을 거치고 본테스트에 입장하기 사전 테스트할 수 있는 링크도 있어 이걸로 사전 연습을 해볼 수 있습니다.

3. 테스트 입장 전

보시다시피 복사가 안되어 외부 IDE에 작성한 코드를 복붙할 수 없습니다.
프로그래머스 자체 에디터에 '직접' 작성해야 합니다.
검색은 허용되어 필요한 부분은 검색하여 풀었습니다.

4. 본 테스트

3시간 동안 3문제를 풀도록 출제됩니다.

문제1 유형 : 구현

 

문제2 유형 : 부분 문자열

관련 문제
관련 문제

 

문제3 유형 : 그래프, 위상정렬, 사이클 체크, 유니온 파인드

out degree 가 0개 또는 1개인 성질을 이용해야 합니다.

관련 키워드 : functional graph
관련 문제

 

테스트 케이스 통과결과만 알 수 있으며 제출 시 점수는 알려주지 않습니다.

문제1의 경우 초반에 어떻게 풀어야하는지 감이 안와 시간을 들여 고민 후 풀었습니다.

문제2의 경우 문제 풀이 해설을 보니깐 문제를 잘못이해했음을 알게되었습니다. 반복되는 패턴이 많은 문자열을 지워야 하는건데 단순히 알파벳 갯수만 세서 많은것만 제외시켜버렸는데 결과적으로 단순히 알파벳 갯수만 세서 많은 것만 제외시켜버리는 방법이 정해임을 알게되었습니다.(의도치 않게 바로 정해로 풀게됨)
문제3의 경우 처음 들어본 유형에 어떻게 풀어야할지 감이 안와 포기했습니다.

5. 소감

코딩 테스트에서 풀어서 제출한 첫 경험이라 2솔했다는 것에 매우 만족합니다.(비록 테스트 케이스 통과지만)

1. 서류

영문 레쥬메를 작성해서 제출해야 됩니다.
따로 양식은 주어지지 않고 예전에 학교에서 영문 이력서 특강을 들어서 받은 양식이 있었는데 그 양식대로 제출했습니다.
작성 내용으로는 학력, 관련활동, 동아리활동, 스킬, 자기소개 등을 작성해서 제출했습니다.

2. 안내 메일

사진처럼 메일이 오고 기재된 날짜 내에 테스트를 치루기만 하면 됩니다.
안내대로 사전등록 과정을 거치고 본테스트에 입장하기 사전 테스트할 수 있는 링크도 있어 이걸로 사전 연습을 해볼 수 있습니다.

3. 테스트 입장 전

챌린지 시작
Google 온라인 챌린지에 오신 것을 환영합니다.

과제 형식:
Google의 온라인 챌린지는 사용자의 코딩 능력을 평가하기 위해 설계되었습니다. 두 개의 코딩 질문을 완료하는 데 60분의 시간이 주어집니다.
다음은 과제를 시작하기 전에 주의할 몇 가지 중요한 사항입니다.

I: 성공적으로 로그인하려면 다음 3단계를 주의 깊게 읽어보십시오.

1단계: 전자 메일 주소로 로그인한 경우 플랫폼에서 로그아웃한 후 인식 모드로 로그인하십시오.

2단계: 챌린지 플랫폼에서 Google 온라인 챌린지 ID와 패스키로 로그인하라는 메시지가 표시됩니다.

3단계: Google의 온라인 도전을 위해:

— 사용자 이름 = 고유한 Google 온라인 챌린지 ID(예: 123456789012) (전자 메일 사용 안 함)

— 암호 = 챌린지 암호(예: 123456)

— 새 계정에 가입하거나 기존 로그인을 계속하는 등 다른 로그인 방법을 사용하지 마십시오. 자신에게 할당된 챌린지 ID와 패스 키를 사용하여만 온라인 챌린지에 로그인하고 참여할 수 있습니다.

참고: "당신(abc@xyz.com)은 이 테스트에 초대되지 않았습니다. 테스트 관리자에게 문의하십시오. Google Support googleonlinechallenge-ticket@google.com" - Google Online Challenge ID 또는 암호를 잘못 입력하여 도전에 액세스했음을 의미합니다. 1~3단계를 다시 수행하십시오!
II: 도구에 익숙해지는 중

실제 도전을 하기 전에 도전 플랫폼의 연습 링크를 사용하여 코딩 환경에 익숙해지십시오. 연습 챌린지의 문제 수와 연습 챌린지의 기간이 실제 챌린지와 다를 수 있으니 참고하시기 바랍니다. 연습 라운드에서 평가를 받지 않습니다. 챌린지가 라이브로 진행되면 어디에서 챌린지를 찾을 수 있는지 알아보려면 아래 이미지를 참조하십시오.

III: 도전을 위하여

할당된 온라인 챌린지 ID 및 암호를 사용하여 도전을 시도하고 있는지 확인합니다.
챌린지가 시작되면 타이머를 일시 중지할 수 없습니다. 도전은 한 번에 완료해야 합니다.
시스템이 Hacker Earth의 호환성 요구 사항을 충족하는 것이 좋습니다.
안정적인 작동 인터넷(최소 속도 5Mbps)을 사용하는 것이 좋습니다. 모바일 인터넷/핫스팟을 사용하지 마십시오.
설치된 확장이 테스트 환경을 방해하지 않도록 무명 또는 개인 창에서 테스트를 시도하는 것이 좋습니다.
다른 창과 탭을 모두 닫아 방해가 되지 않도록 하는 것이 좋습니다.
가장 편한 코딩 언어를 선택하십시오. 코드 중간에 언어를 변경할 경우 수정해야 할 수 있습니다.
최종 답변을 제출하기 전에 테스트 인터페이스의 브라우저 창이나 탭을 닫지 마십시오. 시스템이 갑자기 종료되거나 시간이 부족해도 당황하지 마십시오. 지금까지의 진행 상황은 자동으로 저장됩니다.
테스트 시간이 만료되기 전에 네트워크 문제가 발생할 경우 브라우저를 새로 고치고 테스트에 다시 연결하십시오.
문제가 있는 경우 Google 온라인 챌린지 팀(googleonlinechallenge-ticket@google.com)으로 연락하십시오.

Google은 지원자들이 온라인 챌린지에 한 번 도전하기를 기대하고 있습니다. 온라인 챌린지에 두 번 이상 응시한 것으로 판명된 응시자는 온라인 챌린지 이용 약관을 위반하므로 온라인 챌린지에서 자동으로 자격을 잃게 됩니다. 도전 결과는 온라인에 게시되지 않음을 알려드립니다. 기타 질문은 FAQ를 참조하십시오. 행운을 빌어요!

4. 본 테스트

본테스트는 2문제로 진행됩니다.
사전 테스트를 해보면 알겠지만 문제가 영어로 주어집니다.
평소 백준이랑 프로그래머스만 이용하다보니 문제 해석이 곧바로 되지않아 시간이 오래걸린 점
다른 IDE를 사용할 수 없고 검색 역시 사용할 수 없습니다.

해당 테스트페이지를 빠져나가는 시도를 할 경우 경고메시지가 표시됩니다.
경고가 누적되면 테스트를 강제종료시킵니다.(사전 테스트에서 검색하면서 풀다가 강제종료당함;.;)
hackerearth라는 플랫폼에서 진행되며 사전에 해당 플랫폼에 익숙해지면 좋다고 생각합니다.
답안 틀이 미리 제공되어있고 함수만 작성하면 되는 형태입니다.
입출력 함수를 작성하게끔 되어있어(혹은 작성된 상태로 주어져서)백준이랑 프로그래머스랑 적절히 섞은 느낌이 납니다.

출제된 문제 유형은 정리해서 추후에 올려보도록 하겠습니다.
제 기준에는 어려워서 한 문제도 못풀었습니다 ㅠ.ㅠ

16235_나무 재테크 (Python)

0. 출처

1. 기록

  • 22/04/07 (목)

2. 풀이

(1) 아이디어, 시간복잡도, 자료구조

'''
1. 아이디어
>>
>>

2. 시간복잡도
>>

3. 자료구조
>>
'''

(2) 예제 입력, 예제 출력

- 예제 입력 1 -
sample

- 예제 출력 1 -
sample

(3) 코드

sample

(4) 정리

(5) 참고

참고 풀이

15685_드래곤 커브 (Python)

0. 출처

1. 기록

  • 22/04/07 (목)

2. 풀이

(1) 아이디어, 시간복잡도, 자료구조

'''
1. 아이디어
>>
>>

2. 시간복잡도
>>

3. 자료구조
>>
'''

(2) 예제 입력, 예제 출력

- 예제 입력 1 -
sample

- 예제 출력 1 -
sample

(3) 코드

sample

(4) 정리

0 세대 - 0

1 세대 - 0 1

2 세대 - 0 1 2 1

3 세대 - 0 1 2 1 2 3 2 1

4 세대 - 0 1 2 1 2 3 2 1 2 3 0 3 2 3 2 1

다음 세대는 이전 세대의 '역방향'으로 +1 한 방향을 나타내게 된다. (문제에서 핵심이 되는 규칙성★)
(사람들이 이러한 규칙성을 봤다는게 신기함..)

또한 세대가 증가할 때, 선분의 갯수가 공비가 2인 등비 수열인 것을 파악할 수 있다.
이것으로 배열의 크기를 추측 및 설정할 수 있다.

단순 이중 반복문을 통해 네 꼭짓점이 드래곤 커브로 만들어졌는지 확인하면 된다.
주의할 점은 x, y 방향으로 벽에 도달했을 때는 탐색할 수 없다는 것이다.

(5) 참고

문제 이해1
문제 이해2

https://velog.io/@suuhyeony/JS-JavaScript%EB%9E%80-%EB%B0%B0%EA%B2%BD-%ED%8A%B9%EC%A7%95-%EC%97%AD%ED%95%A0

 

[JS] JavaScript란? (배경, 특징, 역할)

동적인 웹페이지를 만들기 위한 프로그래밍 언어. (HTML/CSS와 완전히 통합 가능) 웹페이지를 조작하고, 클라이언트-서버 간 상호작용에 관한 모든 일을 관여한다.JS로 작성한 프로그램을 script라고

velog.io

 

https://satisfactoryplace.tistory.com/18

 

콜백 함수(Callback)의 정확한 의미는 무엇일까?

다양한 언어나 컴퓨터 관련 지식을 공부하면서, "콜백"이라는 단어는 많이 보았으나 그것의 정확한 의미를 설명해주는 책은 없었던 것 같다. 어쩌면 컴퓨터공학에서는 너무도 당연한 것이라서

satisfactoryplace.tistory.com

 

https://m.blog.naver.com/jhc9639/220967034588

 

[개발자 면접준비]#1. MVC패턴이란

오늘은 개발자면접에 많이 나오기도 하는 MVC패턴에 대해서 알아보고자 합니다. 과연 MVC패턴이 무엇...

blog.naver.com

 

+ Recent posts