4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

✏️ 내가 작성한 코드 

num_list = []  # d(n)담을 리스트

# 1. 1~10000까지 n을 d(n)해줌
for n in range(1, 10000):
    n_sum = n  # ex. d(12) = 12 + 1 + 2 -> 따라서 n, 즉 12는 먼저 sum에 넣고 1,2는 for 돌려가면서 덧셈
    for i in str(n):  # 문자열형식이어야 n의 각 자리수 하나씩 가져올 수 있음
        n_sum += int(i)
    num_list.append(n_sum)

set_num_list = set(num_list)  # 중복 제거를 위해 set으로 만들어줌

# 2. 1~10000까지의 수 중에서 d(n)값들이 들어있는 리스트에 해당되지 않는 수는 출력해줌(셀프넘버)
for j in range(1, 10001):
    if j not in set_num_list:
        print(j)
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

✏️ 내가 작성한 코드 - BFS

from collections import deque

def solution(maps):

    q = deque()
    q.append([0,0])

    n = len(maps) # 행
    m = len(maps[0]) # 열

    move = [[1,0],[-1,0],[0,-1],[0,1]] # 움직임(상,하,좌,우)
    visit = [[-1]*m for _ in range(n)] # 방문 배열 (visit에 해당 행,열까지의 거리 저장함.)
    visit[0][0] = 1 # 거리구할때 0행0열도 포함해서 구하므로 1부터시작.

    while q:
        dn, dm = q.popleft() # 이동 시작할 행,열

        for i in range(4): # 상,하,좌,우로 4가지 방향으로 이동 가능
            next_dn = dn + move[i][0]
            next_dm = dm + move[i][1]

            if next_dn >= n or next_dn < 0 or next_dm >= m or next_dm < 0: # 지도 범위 벗어나면
                continue
            if maps[next_dn][next_dm] == 1 and visit[next_dn][next_dm] == -1: # 지도에서 벽이아님(1) and 방문한적없음(visit[행][열]=-1)
                visit[next_dn][next_dm] = visit[dn][dm] + 1 # 해당 행열까지의 거리수로 update
                q.append([next_dn,next_dm])
    return visit[n-1][m-1]

✏️ 참고

visit에 방문했냐/안했냐(True/False)를 넣는 게 아니라 해당 [행][열]까지의 거리를 계산해서 넣고

마지막 위치인 [n-1][m-1]을 출력해주면서 최단 거리를 구하면된다.

✏️ 곱하기를 이용한 2차원 리스트

n,m = 2,2
a_list = [[-1]*m]*n
print(a_list)

 

a_list를 출력해보면 아래와 같이 확인할 수 있다.

a_list  : [[-1, -1], [-1, -1]]

 

 

여기서 원소 값을 변경해보자.

n,m = 2,2
a_list = [[-1]*m]*n
print(a_list)
a_list[0][0] = 1

a_list[0][0] = 1 은 [[-1, -1], [-1, -1]] 에서 0행 0열을 1로 변경하는 코드다.

다시 a_list를 출력해보자.

n,m = 2,2
a_list = [[-1]*m]*n
print(a_list)
a_list[0][0] = 1
print(a_list)

a_list를 출력해보면 아래와 같이 모든 행의 0열 값이 1로 변경된 것을 확인할 수 있다.

a_list : [[1, -1], [1, -1]]

 

왜일까

2차원 리스트 선언시 '곱셉'을 사용하면 '얕은 복사(shallow copy)'로 만들어진다.

따라서 '같은객체'로 곱하기한만큼 만들어진다는 말이다.

 

그렇다면 어떻게 2차원 배열을 선언할까?

'리스트 컴프리헨션'을 사용하면 된다.

n,m = 2,2
a_list = [[-1]*m for _ in range(n)] # 리스트 컴프리헨션 사용
print(a_list)
a_list[0][0] = 1
print(a_list) # 출력 : [[1, -1], [-1, -1]]

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

✏️ 내가 작성한 코드 - DFS

def dfs(i,n,computers,visit):

    visit[i] = True # 제한사항 : computer[i][i]는 항상 1입니다. -> 따라서 일단 방문처리 해야함.

    for com in range(n):
        if computers[com][i] == 1 and (not visit[com]) : # 방문된 적 없는 연결된 다른 컴퓨터 존재
            dfs(com,n,computers,visit)

def solution(n, computers):
    network_cnt = 0
    visit = [False]*n # 컴퓨터 방문 현황 Fasle로 초기화

    for i in range(n):
        if visit[i] == False: # 방문하지 않은 컴퓨터
            dfs(i,n,computers,visit)
            network_cnt += 1

    return network_cnt

✏️ 내가 작성한 코드 - BFS

from collections import deque
def bfs(n,i,computers,visit):
    q = deque()
    q.append(i)
    visit[i] = True

    while q:
        com = q.popleft()
        for c in range(n):
            if computers[c][com] == 1 and visit[c] == False:
                visit[c] = True
                q.append(c)

def solution(n, computers):
    nexwork_cnt = 0
    visit = [False]*n

    for i in range(n):
        if visit[i] == False:
            bfs(n,i,computers,visit)
            nexwork_cnt += 1

    return nexwork_cnt

✏️ 참고

제한사항 중 computer[i][i]는 항상 1입니다.  이 부분 잘 확인해야 함.

 

 

7568번: 덩치

우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩

www.acmicpc.net

✏️ 내가 작성한 코드 

n = int(input())
size_list = []
rank = []

# 입력받기
for _ in range(n):
    x, y = map(int, input().split())
    size_list.append([x,y])

'''
size_list 배열 원소개수 = 사람수. 
다음사람 size랑 비교해가며 더 작을 경우 순위 +1씩해서 밀려나게.
'''
for idx in range(len(size_list)):
    man_cnt = 1

    for idx2 in range(len(size_list)):
        if idx == idx2: # 자기 자신이랑 비교 x
            continue
        else:
            if size_list[idx][0] < size_list[idx2][0] and size_list[idx][1] < size_list[idx2][1]:
                man_cnt = man_cnt + 1

    rank.append(man_cnt)

print(*rank) # *리스트 : 대괄호 없이 리스트 출력

 

 

10870번: 피보나치 수 5

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가

www.acmicpc.net

✏️ 내가 작성한 코드 

# f(n) = f(n-1) + f(n-2)
# f(0) = 0 , f(1) = 1
n = int(input()) # n 입력받음
fibo = 0

if n == 0:
    fibo = 0
elif n == 1:
    fibo = 1
else:
    fibo_list=[0,1]
    for i in range(2,n+1):
        fibo_list.append(fibo_list[i-1]+fibo_list[i-2])
    fibo = fibo_list[n]

print(fibo)

✏️ 재귀

def fibo(n):
    if n <= 1:
        return n
    else:
        return fibo(n-1)+fibo(n-2)

n = int(input())
print(fibo(n))
 

1978번: 소수 찾기

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

www.acmicpc.net

✏️ 내가 작성한 코드 

n = int(input())
nlist = map(int, input().split())
cnt = 0

for num in nlist:
    if num == 1: # 1은 소수가 아니므로 continue
        continue
    else:
        for i in range(1,num+1):
            if i == num: # 밑에 else에서 break글 안거치고 끝까지 왔으므로 cnt 1증가
                cnt += 1
            else:
                if i != 1 and num%i == 0: # 1이 아닌 다른 수로 나눠지면 소수 아님
                    break
print(cnt)
 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때

www.acmicpc.net

 

✏️ 내가 작성한 코드 

 

count = int(input())  # 입력 받을 단어 개수
words = []  # 입력 받은 단어들 넣을 배열
group_word_cnt = 0  # 그룹 단어 개수

for _ in range(count): # 단어들 입력 받음
    word = input()
    words.append(word)

for word in words:
    chr_list = [word[0]] # 단어의 각 문자 들어갈 배열, 첫문자 일단 넣어줌
    if len(word) == 1:
        group_word_cnt += 1
    else:
        for i in range(1,len(word)):
            if word[i] == word[i-1]: # 앞 문자랑 같은 경우
                if i == len(word)-1: # 앞 문자랑 같고, 현재 인덱스가 마지막 인덱스라면
                    group_word_cnt += 1 # 그룹단어 해당
                continue # 앞 문자랑 같으면 continue
            else: # 앞 문자랑 같지 않은 경우
                if word[i] in chr_list : # 앞 문자랑 다르고 배열에 있으면 --> 그룹단어아님
                    break
                chr_list.append(word[i]) # 앞 문자랑 다르고 배열에 없으면 배열에 넣어줌
            if i == len(word)-1: # 마지막 인덱스까지 반복문 거쳐서 온 경우
                group_word_cnt += 1 # 그룹단어 해당

print(group_word_cnt)

+ Recent posts