솔직히 보안 직무를 지원하고 싶었는데, 삼성생명만 보안직무가 있었던 것으로 기억한다. 그마저도 내 경험이랑은 잘 맞지 않았다.
삼성전자 DX에 부분적으로 보안을 하는 직무가 몇 개 있길래, 학교에서 하던 프로젝트 기반으로 가장 핏한 직무를 찾아 원서를 넣었다. 다만 직무의 큰 분류는 'SW개발'이라 코테가 필수적이었다... 지금까지 입사 코테를 4~5번 경험한 입장에서 삼성코테는 기본적인 개념만 알고도 풀 수 있다고 하길래 (?) 코드트리와 프로그래머스에 있던 기출, DFS/BFS 복습, 그래프 순회 복습만 하고 갔다. 결론적으로는 작년이랑 난이도가 비슷했지만, 3년 이상 차이나는 기출보다 확실히 어렵다.
서류
- 삼성전자를 지원한 이유와 입사 후 회사에서 이루고 싶은 꿈을 기술하십시오.
- 본인의 성장과정을 간략히 기술하되 현재의 자신에게 가장 큰 영향을 끼친 사건, 인물 등을 포함하여 기술하시기 바랍니다.
- 최근 사회 이슈 중 중요하다고 생각되는 한 가지를 선택하고 이에 관한 자신의 견해를 기술해 주시기 바랍니다.
- 지원 직무 관련 본인의 전문지식과 경험을 작성하고, 본인이 지원 직무에 적합한 사유를 삼성전자 제품과 서비스 사용 경험을 기반으로 기술하시기 바랍니다.
코딩테스트
- python 선택..
- 오전반 당첨
왕복 4시간을 다녀왔다. 집에서 6시에 출발해 8시 도착했다. 삼성인재개발원에서 진행했는데 안은 보안구역이라 직원분들과 시험장까지 들어간다. 나갈 때도 마찬가지! 조기퇴실하면 차량 진입 입구까지 데려다주신다.
삼성 코테 환경에 대해 설명하자면, 컴퓨터나 노트북이 각자 지급되고 자리는 큰 강의실에 옆에 한 자리씩 비우고 앉는 방식이다. 검색 인터넷 사용 모두 불가하다. 코테(웹) 시스템과 pypy 를 열어서 풀 수 있다. (메모장까지는 켤 수 있다. 이번에 출력 예시 파일을 txt로 줬다.)
python의 경우 sys 사용 불가하다!! 아래 링크에서 환경에 대한 연습이 필수이다.
https://swexpertacademy.com/main/main.do
2문제가 나오고, 문제를 여는 순간부터 시간이 카운팅 된다. 보통 1솔의 경우 합격하는 것 같다. 나는 궁금해서 처음부터 그냥 두 문제 다 봤다.
https://www.codetree.ai/ko/frequent-problems/problems/mint-choco-milk/description
삼성 코딩테스트 기출 문제 설명: 민트 초코 우유 | 코드트리
삼성전자 코딩테스트 기출 문제 민트 초코 우유의 상세 설명입니다. 문제 요구사항을 정확히 파악하고 효율적인 알고리즘을 설계해보세요.
www.codetree.ai
내가 풀었던 문제이다. 나는 코드트리 기출이 진짜 삼성 기출인줄 알았는데, 지금 보니까 푸는 과정은 비슷하지만 주제랑 내용이 다르다. (아마 저작권 문제 때문인 것 같다... 그리고 내 기억이 왜곡된 것인지 출력도 약간 다르게 문제를 낸 것 같다..)
난이도는 이 정도이고, 나는 오전 1번 문제만 제출했다. 레벨을 보니 오전 문제가 더 쉬웠던 것 같다.
다시 한 번 풀어보았다. 코드 최적화가 필요해보임..
문제 풀이 과정
- 시뮬레이션 + DFS + 정렬 + 비트마스크
시뮬레이션 | 하루에 아침 → 점심 → 저녁 단계를 순서대로 구현 |
DFS (Flood-Fill) | 점심 단계에서 음식 신념이 같은 학생들 그룹으로 묶을 때 사용 |
정렬 | 그룹 내 대표자 선정 및 저녁 단계 전파자 순서 정할 때 필요 |
비트마스크 | 음식 신념을 T(1), C(2), M(4)로 표현하여 AND/OR 연산 처리 |
자료 구조 (리스트, 튜플) | 각 단계에서 학생 그룹, 대표자 정보 등을 저장/갱신 |
아침 | 모든 칸의 신앙심 +1 | 반복문 |
점심 | DFS로 그룹 만들고 대표자 선정 | DFS + 정렬 |
저녁 | 대표자가 전파력으로 주변 전파 | 비트 연산 + 조건 분기 + 시뮬레이션 |
시간 제한 내에 작성한 코드(주석 추가 ver, 코드트리 제출 조건으로 작성)
MAX_N = 55 # 최대 격자 크기 (1-indexed 사용)
DIRS = [(-1, 0), (1, 0), (0, -1), (0, 1)] # 상, 하, 좌, 우 방향 벡터
# 격자 크기 N, 진행 일수 D
N, D = 0, 0
# 음식 신념 정보 (비트마스크 형태), 신앙심 정보
food_grid = [[0] * MAX_N for _ in range(MAX_N)]
faith_grid = [[0] * MAX_N for _ in range(MAX_N)]
# DFS 방문 체크용, 전파 방어 상태
visited = [[False] * MAX_N for _ in range(MAX_N)]
defended = [[False] * MAX_N for _ in range(MAX_N)]
# 대표자 리스트: (기본 음식 수, -신앙심, 행, 열)
leaders = []
# 범위 확인 함수
def in_bounds(x, y):
return 1 <= x <= N and 1 <= y <= N
# 비트마스크에서 기본 음식 개수 세는 함수
def count_food_bits(val):
return bin(val).count('1')
# 점심 단계: DFS로 그룹 구성
def dfs(x, y, target_food, group):
visited[x][y] = True
group.append((x, y))
for dx, dy in DIRS:
nx, ny = x + dx, y + dy
if in_bounds(nx, ny) and not visited[nx][ny] and food_grid[nx][ny] == target_food:
dfs(nx, ny, target_food, group)
# 점심 단계: 그룹 구성 → 대표자 선정 → 신앙심 추가 → 대표자 리스트 저장
def lunch_phase():
global leaders
leaders = []
# 방문 초기화
for i in range(1, N + 1):
for j in range(1, N + 1):
visited[i][j] = False
# 전체 칸을 돌며 그룹 구성
for i in range(1, N + 1):
for j in range(1, N + 1):
if not visited[i][j]:
group = []
dfs(i, j, food_grid[i][j], group)
# 대표자 선정 기준: 신앙심 ↓, 행 번호 ↑, 열 번호 ↑
leader = min(group, key=lambda pos: (-faith_grid[pos[0]][pos[1]], pos[0], pos[1]))
# 대표자에게 그룹원 수만큼 신앙심 추가
faith_grid[leader[0]][leader[1]] += len(group)
food_count = count_food_bits(food_grid[leader[0]][leader[1]])
# 대표자 정보 저장 (정렬을 위해 -신앙심 사용)
leaders.append((food_count, -faith_grid[leader[0]][leader[1]], leader[0], leader[1]))
# 저녁 단계: 대표자들이 신앙심 기반 전파 진행
def evening_phase():
# 방어 상태 초기화
for i in range(1, N + 1):
for j in range(1, N + 1):
defended[i][j] = False
# 대표자 정렬: 기본 음식 수 ↑, 신앙심 ↓, 행 ↑, 열 ↑
leaders.sort()
for _, _, x, y in leaders:
if defended[x][y]:
continue # 이미 전파받았으면 skip
dir_idx = faith_grid[x][y] % 4 # 전파 방향 결정
dx, dy = DIRS[dir_idx]
power = faith_grid[x][y] - 1 # 전파력
faith_grid[x][y] = 1 # 전파 후 신앙심 1로 감소
nx, ny = x, y
# 전파 진행
while True:
nx += dx
ny += dy
if not in_bounds(nx, ny):
break
# 동일 신념 → 전파하지 않음
if food_grid[nx][ny] == food_grid[x][y]:
continue
target_faith = faith_grid[nx][ny]
if power > target_faith: # 강한 전파
faith_grid[nx][ny] += 1
power -= (target_faith + 1)
food_grid[nx][ny] = food_grid[x][y]
defended[nx][ny] = True
else: # 약한 전파
faith_grid[nx][ny] += power
food_grid[nx][ny] |= food_grid[x][y]
defended[nx][ny] = True
break
if power <= 0:
break
# 하루가 끝난 후 출력하는 함수: 음식 신념별 총 신앙심
def print_faith_sums():
sums = [0] * 8 # 1~7까지 인덱스 사용
for i in range(1, N + 1):
for j in range(1, N + 1):
sums[food_grid[i][j]] += faith_grid[i][j]
print(sums[7], sums[3], sums[5], sums[6], sums[4], sums[2], sums[1])
# 입력 처리
import sys
input = sys.stdin.readline
# 격자 크기 N, 진행 일수 D
N, D = map(int, input().split())
# 음식 신념 입력 ('T'→1, 'C'→2, 'M'→4)
for i in range(1, N + 1):
line = ' ' + input().strip() # 인덱스를 1부터 쓰기 위해 앞에 공백 추가
for j in range(1, N + 1):
c = line[j]
if c == 'T':
food_grid[i][j] = 1
elif c == 'C':
food_grid[i][j] = 2
elif c == 'M':
food_grid[i][j] = 4
# 초기 신앙심 입력
for i in range(1, N + 1):
faith_grid[i][1:N+1] = map(int, input().split())
# 시뮬레이션 반복
for _ in range(D):
lunch_phase()
evening_phase()
print_faith_sums()
후기
그냥 코테 준비만 할 것이 아니라, 삼성 코테 환경에서의 준비가 확실히 필요한 것 같다. 저 SW아카데미 사이트에서의 연습을 꼭 추천한다. 또 서합-코테 기간이 2주 정도로 매우 짧기 때문에 서류 전부터 어느정도 코딩 실력이 있어야 합격 가능한 것 같다.
'개발 > 코딩테스트&알고리즘' 카테고리의 다른 글
[LINE] 코딩테스트 연습문제 풀이 (0) | 2025.04.17 |
---|---|
0413 (0) | 2025.04.13 |
시간복잡도 (0) | 2025.03.24 |
파이썬 1일차 (0) | 2025.03.24 |
백준 풀이들 (0) | 2024.03.28 |