로또의 최고 순위와 최저 순위 (Python)

0. 출처

1. 기록

  • 22/03/27 (토)

2. 풀이

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

1. 아이디어
>> lottos 와 win_nums 에서 일치하는 개수를 구한다. (최소 당첨 개수 및 등수)
>> lottos 에서 0 인 개수만큼 나머지와 일치한다고 가정한다. (최대 당첨 개수 및 등수)
>> lottos 에서 0 없이 모든 숫자가 부여된 경우는 등수를 어떻게 할 수 없음

2. 시간복잡도
>> ?

3. 자료구조
>> 리스트

(2) 풀이

def trans(cnt):
    prize = 0
    if cnt >= 2:
        prize = 7 - cnt
        return prize
    elif cnt <=1 :
        prize = 6
        return prize

def solution(lottos, win_nums):
    min_cnt = 0
    joker_cnt = 0
    for lotto in lottos:
        if lotto in win_nums:
            min_cnt += 1
        elif lotto == 0:
            joker_cnt += 1

    max_cnt = min_cnt + joker_cnt

    answer = []
    answer.append(trans(max_cnt))
    answer.append(trans(min_cnt))
    return answer

(3) 참고 및 정리

7576_토마토 (Python)

0. 출처

1. 기록

  • 22/03/25 (금)

2. 풀이

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


1. 아이디어
>> BFS 이용 q에 토마토 위치를 담고  
>> 네 방향으로 익힌뒤 다시 익힌 토마토의 위치를 담고 카운트해준다.

2. 시간복잡도
>> o(v+n) ?

3. 자료구조
>> 이차원배열  
>> BFS  

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

예제 입력 1
6 4
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1

예제 출력 1
8

예제 입력 2
6 4
0 -1 0 0 0 0
-1 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1

예제 출력 2
-1

(3) 풀이

from collections import deque
from pprint import pprint

m, n = map(int, input().split())

a = n # 세로
b = m # 가로

graph = [list(map(int, list(input().split()))) for _ in range(a)]

# pprint(graph)

dx = [0, -1, 0, 1]
dy = [-1, 0, 1, 0]

q = deque()
for i in range(a):
    for j in range(b):
        if graph[i][j] == 1:
            q.append((i,j))

cnt = 0
while q:
    x, y = q.popleft()
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0<=nx<a and 0<=ny<b:
            if graph[nx][ny] == 0:
                graph[nx][ny] = graph[x][y] + 1
                q.append([nx,ny])
            else:
                continue
    cnt += 1

answer = 0
for i in range(a):
    for j in range(b):
        if graph[i][j] == 0:
            print(-1)
            quit()
        answer = max(answer, graph[i][j])

print(answer-1)

(4) 참고 및 정리

처음에 m(가로), n(세로) 순서로 입력되는 것을 x(세로), y(가로) 로 바꿨는데
밑에 부분에서 nx, ny 를 구할 때 x, y 를 직접 사용해서 꼬인 부분이 있었다. 항상 변수 사용에 주의하자!

이중 for 문을 빠져나오기 위해서는 break 를 사용하면 안됩니다.
추가적인 변수를 사용해주거나(흔히 flag = True 등) quit() 또는 exit() 함수를 이용해주면 쉽게 이중for문을탈출할 수 있습니다.

graph 자체에 날짜를 카운트 방법으로 추가적인 이차원 배열이나 변수를 사용하지않아도 되었습니다.
또한 max 함수를 이용해서 최댓값 비교도 손쉽게 할 수 있었습니다.

16918_봄버맨

0. 출처

1. 기록

  • 22/03/25 (금)

2. 풀이

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

1. 아이디어
>> 3초라는 시간을 채우면 폭발하는게 중요
>> 특정 폭탄이 설치된 곳과 설치된 곳의 시간을 체크하는게 중요
>> 폭탄이 설치되지 않은 다른 곳에 모두 폭탄을 설치해야 됨 (BFS)
>> time_graph
>> bomb_graph


2. 시간복잡도
>> 어떻게 구하는거야?
>> 시간 복잡도 계산하는 법 알아봐야 겠다

3. 자료구조 
>> 이차원 배열
>> BFS 

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

- 예제 입력 1 - (r, c, n초)
6 7 3
.......
...O...
....O..
.......
OO.....
OO.....

- 예제 출력 1 -
OOO.OOO
OO...OO
OOO...O
..OO.OO
...OOOO
...OOOO

- 예제 입력 2 -
6 7 4
.......
...O...
....O..
.......
OO.....
OO.....

- 예제 출력 2 -
OOOOOOO
OOOOOOO
OOOOOOO
OOOOOOO
OOOOOOO
OOOOOOO

- 예제 입력 3 -
6 7 5
.......
...O...
....O..
.......
OO.....
OO.....

- 예제 출력 3 -
.......
...O...
....O..
.......
OO.....
OO.....
'''

(3-1) 틀린 풀이

from pprint import pprint
from collections import deque

r, c, n = map(int, input().split())

bomb_graph = [list(map(str, list(input()))) for _ in range(r)]
time_graph = [[0]*c for _ in range(r)]

dx = [0, -1, 0, 1]
dy = [-1, 0, 1, 0]

def step1():
    for x in range(r):
        for y in range(c):
            if bomb_graph[x][y] == 'O':
                time_graph[x][y] += 1       # 1초 동안 아무것도 하지 않는다.

def step2():                                # 폭탄이 설치되지 않은 곳에 폭탄을 설치한다.
    for x in range(r):
        for y in range(c):
            if bomb_graph[x][y] == '.':     # 폭탄이 설치되어있지 않은 곳에
                bomb_graph[x][y] = 'O'      # 폭탄을 설치하고
                time_graph[x][y] += 1       # 시간 +1
            elif bomb_graph[x][y] == 'O':   # 이미 폭탄이 설치되있는 곳에는
                time_graph[x][y] += 1       # 시간만 +1

def step3():
    for x in range(r):
        for y in range(c):
            if bomb_graph[x][y] == 'O':     # 폭탄이 설치되어 있고
                time_graph[x][y] += 1       # 시간을 +1 했을 때
                if time_graph[x][y] >= 3:   # 시간이 3초이면
                    bomb_graph[x][y] = '.'  # 그 자리에 터뜨리고
                    for i in range(4):      # 4방향을 확인
                        nx = x + dx[i]
                        ny = y + dy[i]
                        if 0<=nx<r and 0<=ny<c:
                            if bomb_graph[nx][ny] == 'O':   # 폭탄이 있는 곳이면
                                bomb_graph[nx][ny] = '.'    # 폭탄을 없애고
                                time_graph[nx][ny] = 0      # 해당 시간을 0으로 초기화
    # pprint(bomb_graph)


time = 0

step1()
time += 1

while 1:
    if time >= n:
        break
    else:
        step2()
        time += 1

    if time >= n:
        break
    else:
        step3()
        time += 1

for i in range(r):
    for j in range(c):
        if j == (c-1):
            print(bomb_graph[i][j])
        else:
            print(bomb_graph[i][j], end='')

(3-2) 정답 풀이

from collections import deque

r, c, n = map(int, input().split())

bomb_graph = [list(map(str, list(input()))) for _ in range(r)]

time_graph = [[0]*c for _ in range(r)]

dx = [0, -1, 0, 1]
dy = [-1, 0, 1, 0]

def loc_bombs():                            # 폭탄 위치 찾아 q 에 저장
    for x in range(r):
        for y in range(c):
            if bomb_graph[x][y] == 'O':
                q.append((x, y))


def make_bombs():                              # 모든 자리에 폭탄 설치
    for x in range(r):
        for y in range(c):
            if bomb_graph[x][y] == '.':
                bomb_graph[x][y] = 'O'

def explode():                              # q 에 들어있는 좌표로 폭탄 터트림
    while q:
        x, y = q.popleft()
        bomb_graph[x][y] = '.'
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0<=nx<r and 0<=ny<c:
                bomb_graph[nx][ny] = '.'


n -= 1  # 1초 동안 아무것도 하지 않는다
while n:
    q = deque()
    loc_bombs()
    make_bombs()
    n -= 1
    if n == 0:
        break
    explode()
    n -= 1

for i in range(r):
    for j in range(c):
        if j == (c-1):
            print(bomb_graph[i][j])
        else:
            print(bomb_graph[i][j], end='')

3. 참고 및 정리

3초가 된 폭탄은 동시에 터지도록 작성해야합니다.

틀린 풀이로 풀 경우 동시에 설치된 폭탄들이 위치에 따라 연속되어 있는 경우 3초가 되면 선순위에 있는게 먼저 터져 후순위에 있는 폭탄이 사라지게 되는 오류가 발생됩니다. (같은 시기에 설치된 폭탄은 '동시에' 터져야 함)
큐나 덱의 자료구조를 이용해 초기 폭탄 위치를 보관해줌으로서 이러한 문제점을 해결할 수 있습니다.

또한 이러한 자료구조를 이용함으로서 초기 설치한 폭탄과 나중에 설치한 폭탄을 구분지어줄 수 있습니다.


참고한 풀이

라인 상반기 코테 후기

서류

라인은 서류 통과는 쉽다고 합니다. 03/26(토) 오전 10:00 ~ 오후 1시 까지 3시간 가량 시험을 치뤘습니다. 메일로 프로그래머스 링크가 날라오는데 문의 관련 메일이랑 따로 날라와서 문의 메일만 쳐다보고 있다가 늦게 입장했습니다.

본 테스트

문항수 : 6


문제1 로그 수집 프로그램
유형 : 정규식, 구현
정규식 쓰면 풀 수 있을 것 같다는 느낌이 들었지만 한번도 제대로 써본적이 없어서 넘어감.

문제2 부서진 키보드
유형 : 조합
조합 써야 되겠다 생각했는데 문제 요구 사항에 맞게 어떻게 작성해야되는지 바로바로 안떠올라서 이 문제에서 시간을 많이 썼습니다.

문제 3 재택근무 전환
유형 : 구현

문제 4 표 편집 프로그램
유형 : 누적합

문제 5 팀의 리더
유형 : gap (처음들어 봄..)

문제 6 온라인 화폐 거래소
유형 : 우선순위 큐

후기

최근 삼성 코테 준비한다고 DFS, BFS, 구현만 풀어봤는데 문자열 관련 문제 해쉬, 맵 등의 문제등은 안풀어봐서 지난번 보다 쉽다는 평들이 많으셨으나 저에게는 너무 어려웠습니다. 여러 유형 꾸준히 풀고 블로그에 게시하도록 하겠습니다.

기업별로 코테 환경이나 서칭가능, IDE사용가능 등의 시험조건이 다르기 때문에 최대한 지금 실력이 많이 모자르더라도 계속 지원해서 치뤄보려고 계획 중입니다.

참고

파이썬 정규표현식과 re모듈

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=drryuhk&logNo=221105634301 

 

O2O 산업의 정의와 분류

O2O 산업은 좁게는 온라인으로 고객을 유치하여 오프라인 커머스를 지원하는 것으로 정의할 수 있으며 넓...

blog.naver.com

 

https://kewook55.tistory.com/1?category=956055 

 

[2020년 하반기] LG CNS 서류, 필기, 코딩테스트 후기

2019년 하반기 LG CNS에 IT 서비스 직군으로 지원했고 서류에서 광탈했다. 그리고 코로나19로 인해 흐지부지 상반기가 지나갔고 2020년 8월 말에 재지원하게 되었다. 프로세스는 아래와 같았고 "서류

kewook55.tistory.com

 

https://kewook55.tistory.com/2?category=956055 

 

[2020년 하반기] LG CNS 1차면접 후기

면접 형태는 다음과 같다. 多:多 면접 skype를 통한 온라인 화상면접 약 4일간의 면접 일정에서 안내받은 날짜와 시간대에 skype에서 대기하고 있으면 됐다. 면접은 2:2 면접이었고 그룹 화상전화를

kewook55.tistory.com

 

https://kewook55.tistory.com/3?category=956055 

 

[2020년 하반기] LG CNS 2차면접 후기

면접 형태는 다음과 같다. 多:1 면접 skype를 통한 온라인 화상면접 임원면접 1차 면접과 동일하게 안내받은 날짜에 skype에서 대기하고 있었다. 안내받은 형태는 다대일 면접이었지만 1:1 면접으로

kewook55.tistory.com

 

https://okky.kr/article/1177293

 

OKKY | SI,정부과제 vs 서비스 vs 솔루션 장단점

(아래 관련 글의 댓글로 달았다가 글이 길어져서 따로 글을 만듭니다.) 당연히 모든 경우가 아래의 경우에 해당하진 않습니다.  회사 규모,제품과 회사 지향점, 리더들의 특성 및  본인의 위치

okky.kr

 

https://daebalpri.me/entry/LG-CNS-%EC%B5%9C%EC%A2%85%ED%95%A9%EA%B2%A9-%ED%9B%84%EA%B8%B0%EC%99%80-%EC%A3%BC%EC%A0%80%EB%A6%AC%EC%A3%BC%EC%A0%80%EB%A6%AC

 

LG CNS 최종합격 후기와 주저리주저리

서론 지난 12월 17일 LG CNS으로부터 최종 합격 통보를 받고 동해안 여행을 이미 다녀왔으며 현재는 제주도 스쿠터 종주를 떠나와있다. 네카라쿠배당토를 포함한 인기있는 IT 회사들은 면접 후기

daebalpri.me

 

https://www.youtube.com/watch?v=0tLTEg-ftvI&ab_channel=%EC%9D%B8%EC%8B%B8%EB%8B%B4%EB%8B%B9%EC%9E%90 

 

https://velog.io/@phi0friday/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%BD%94%EB%93%9C%EB%A5%BC-%EA%B9%94%EB%81%94%ED%95%98%EA%B2%8C-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%9D%BC%EA%B4%80%EC%84%B1-%EC%9E%88%EA%B2%8C-%EC%9E%91%EC%84%B1%ED%95%98%EB%8A%94%EB%B2%95

 

파이썬 코드를 깔끔하게, 그리고 일관성 있게 작성하는법

black과 isort를 vscode에서 사용하자

velog.io

 

https://2ykwang.dev/posts/vscode%EC%97%90%EC%84%9C-flake8-black-isort-%EC%84%A4%EC%A0%95

 

vscode에서 flake8 black isort 설정하기 - 2ykwang

설치 $ pip install flake8 $ pip install isort $ pip install black poetry install flake8 black isort --dev 설정 vscode 설정 사용하기 패키지 설치 후 vscode 커맨드 팔레트에 Open Workspace Settings를 입력해 프로젝트 설정파일

2ykwang.dev

 

+ Recent posts