코테 43

[Python/BOJ] 백준 1034 램프_아이디어가 핵심

완탐인가 했는데 완탐은 맞다. 다만 아이디어를 곁들인... 대체 이런 아이디어는 어떻게 떠올리는지 궁금하다. 1. 먼저 행별로 0의 개수를 구한다. 2. 조건에 부합한 행을 찾는다. 2-1. 0의 개수가 k(변환 횟수)보다 크다면 k번을 다 뒤집어도 다 켜질수가 없으므로 첫번째 조건은 0의 개수가 k보다 작거나 같다. 2-2. 그리고 두번 째 조건은 0의 개수가 짝수라면 k도 짝수 , 0의 개수가 홀수라면 k도 홀수여야한다. 그 이유는 k 보다 작은 0들을 모두 1로 바꾼 다음 남은 k의 값이 짝수여야만 불이 켜진 상태를 유지할 수 있기 때문이다. 만약 0이 짝수고 k도 짝수라면 k의 개수에서 0을 빼면 남는 값은 짝수이다. 만약 0이 홀수고 k도 홀수라면 k의 개수에서 0을 빼면 남는 값은 짝수이다. ..

[삼성SW역량][Python/BOJ] 백준 21611 마법사 상어와 블리자드_구현

와 정말 복잡한 구현이다. 이 문제를 많이 풀면 구현능력이 생길것같다. 자주 풀어보자. 1. 입력된 그래프를 일렬로 만들어 deque 형태로 저장한다. (indexing 함수) 2. m번 만큼 magic_shark를 호출한다. 2-1. dir방향으로 s만큼 0으로 만들어준다. 2-2. fill_blank 함수로 0을 채워준다. 2-3. 연속된 구슬이 4개 이상 있다면 터뜨린다.(bomb 함수) 터뜨리면서 개수를 저장한다. 2-4. 터지는 구슬이 있는 동안 fill_blank함수를 호출한다. 2-5. grouping 함수로 개수와 숫자로 구슬을 덮어준다. 3. 저장된 터뜨린 구슬의 개수를 계산하여 출력한다. 코드 : from collections import deque def indexing(): # 중앙..

[Python/BOJ] 백준 15927 회문은 회문이 아니야!!_문자열

처음에 정직하게 풀려고 했으나 계속 시간초과가 발생했다. 역시 사람이 머리를 써야 문제가 풀린다. 이 문제는 3가지로 상황을 나누어 풀어야한다. 1. 회문일 경우 -> 전체 길이 -1 1-2. 회문인데 전부 똑같은 문자열 일경우 -> -1 2. 회문이 아닐 경우 -> 전체 길이 코드 : # 팰린드롬인지 확인 def palin(search) : for i in range(len(search)//2) : if search[i] != search[-(i+1)] : return False return True # 전부 같은 문자열인지 확인 def same(search) : for i in range(1,len(search)) : if search[i] != search[0] : return False retur..

[삼성SW역량][Python/BOJ] 백준 17143 낚시왕_구현

딱히 어렵다고 생각되지는 않았다. 상어가 벽에 충돌할 때 구현하는 법만 안다면 쉬운 문제였으나 그 방법을 생각 못했다. 따로 수학공식이 있을 것이라 생각하고 계속 생각해보려고 했는데 못찾았다. 답을 찾아보니 간단하게 방향만 바꿔주고 가야할 길이를 줄이지 않으면 해결되는 것이었다. 이 문제를 통해 배웠으니 다른 문제에서 만나면 사용하자. 추가로 문제가 분명히 맞는데 자꾸 틀리다라고 떠서 한참을 봤다. 그 이유는 처음 입력받은 r,c를 상어 위치하면서 똑같은 변수에 r,c를 받아서 다른 값으로 변경되었었기 때문이다. 입력받는 변수이름을 주의하자. 1,2,3,4가 상 하 우 좌이다. 이를 0부터 시작하도록 변경하여 그리면 이렇다. 0과 2의 경우 반대 방향으로 가려면 1을 더하면 되고 1과 3의 경우 반대 방..

[삼성SW역량][Python/BOJ] 백준 16236 마법사 상어와 파이어볼(구현)

처음 문제를 풀때 for문으로만 주구장창 풀었다. 코드는 더러워지고 길어졌다. 게다가 답도 제대로 나오지않았다. 처음부터 mp에 넣고 결과를 구했기 때문이다. fireball이라는 리스트를 만들어 이용하면 더 간편하고 깔끔하게 풀이할 수 있다. 문제에는 아래와 같은 문구가 있다. 1번 행과열이 n번 행과열과 붙어있다는 의미이므로 nr과 nc를 구해도 다시 안으로 돌아도록 %n을 해주면된다. nr = (cr+(cs*dx[cd])) % n nc = (cc+(cs*dy[cd])) % n dx와 dy는 문제의 0,1,2,....7 방향대로 맞추어서 설정해준다. 문제 풀이 : 1. fireball 리스트에 입력받는다. 2. k번 반복한다. 2-1. fireball들을 리스트에서 꺼내서 이동시킨후 mp에 넣는다. ..

[삼성SW역량][Python/BOJ] 백준 16236 아기상어(BFS,구현)

주의해야할 점은 list를 pop()하면 뒤의 원소(마지막원소)부터 반환된다는 것이다. 그래서 먹을 수 있는 물고기의 리스트를 역순으로 정렬해야한다. 이렇게 ! return sorted(tmp, key = lambda x : (-x[2],-x[0],-x[1])) 또는 reverse = True를 뒤에 달아줘도 된다. return sorted(tmp, key = lambda x : (x[2],x[0],x[1]), reverse = True) 또는 pop(0)로 바꾸면 된다. 아래 코드는 pop(0)로 만들었다. BFS는 항상 최단거리만을 나타낸다는 점을 이용한다. 1. 아기상어의 위치를 구한다. 2. biteFish라는 함수를 수행한다.(인수로는 상어의 위치와 상어의 길이를 준다.) 2-1. 인수로 들어온..

[삼성SW역량][Python/BOJ] 백준 16235 나무재테크(구현)

삼성...그저 구현...! 한 자리에 나무가 여러개가 있을 수 있으므로 각각의 값을 리스트로 설정해주어야한다. tree = [[[] for _ in range(n)] for i in range(n)] 이런 식으로 코드를 만들어 주어야한다. dx = [-1,-1,-1,0,0,1,1,1] dy = [-1,0,1,-1,1,-1,0,1] if __name__=="__main__" : n,m,k = map(int,input().split()) # 매년 겨울 추가되는 영양분 plus_nutri = [list(map(int,input().split())) for i in range(n)] # 영양분 ground = [[5]*n for i in range(n)] # 트리의 나이 tree = [[[] for _ in r..

[삼성SW역량][Python/BOJ] 백준 17779 게리맨더링2(구현)

처음 문제를 봤을 때 조건이 너무 많아서 어질했다. 어떤 방법을 써야할지 모르겠어서 답을 봤더니 정말 그 많은 조건들을 다 구현하면 되는 문제였다. 두려워하지말고 하나하나 구현해야겠다는 생각을 했다. 1. 4중 for문을 돌면서 조건에 맞는 x, y, d1, d2를 선택하여 cal 함수를 돌린다. 2. cal 함수 2-1. 경계면을 5번으로 할당 2-2. 경계면 내부를 5번으로 할당 2-3. 전체 구역을 돌면서 1,2,3,4,5의 인구를 구한다. 2-4. 각 인구의 최대값, 최소값을 구해 뺀 수를 반환한다. 경계면 내부를 5로 만들 때 행을 x+1 부터 x+d1+d2까지 돌린다는 것을 잊지말아야한다. 경계면 가장 위의 행이 x이고 가장 아래 행은 x+d1+d2이기 때문이다. 경계면 내부를 5로 만들기 위..

[삼성SW역량][Python/BOJ] 백준 20055 컨베이어 벨트 위의 로봇(구현)

언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다 이 부분을 코드에 넣지않아서 계속 틀렸었다. 변화가 있을 때마다 언제든지 , 즉 [n-1]자리에 로봇이 있다면 0으로 변경해준다. 코드 : from collections import deque if __name__=="__main__" : n,k = map(int,input().split()) durability = deque(map(int,input().split())) robot = deque([0]*(n*2)) ans = 0 while True : ans +=1 # 한 칸 회전 durability.rotate() robot.rotate() if robot[n-1] :# 내리는 자리에 로봇이 있다면 내림 robot[n-1] = 0 #로봇 이동 f..

[삼성SW역량][Python/BOJ] 백준 14499 주사위굴리기(시뮬레이션)

삼성문제 특 ) 그냥 빡구현 1,2,3,4 번이 동서남북이 아니라 동서북남이다!!! +) 주사위는 지도의 바깥으로 이동시킬 수 없다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안 된다 -> nx,ny를 구하고 지도를 벗어나는지 확인해주어야한다. 코드 : # 동서북남 dx = [0,0,-1,1] dy = [1,-1,0,0] def move(dir) : global x,y nx,ny = x + dx[dir], y + dy[dir] if 0