별건 아니지만 어쩌다보니 우당탕탕 합격했던 LG전자에 대해서 좀 많이 늦은 후기를 쓰려고 한다.

지원할 때 이런 글 하나하나가 굉장히 도움되었기 때문에... 조금이라도 도움이 되기 위해서 글을 쓰지만, 음.. 어디까지 써야할지 모르겠으니 최대한 간결하게 정리해보겠다.

서류 지원

2024년 3월 엘지의 채용이 열리게 되었다.

바로 서류지원

자기소개서는 생각보다 문항과 글자수가 많지 않았다.

  1. "LG전자"에 대한 지원동기에 대하여 구체적으로 기술하여 주십시오. (1000자)
  2. 본인이 지원한 직무관련 향후 계획에 대하여 (500자)

이렇게 1500자만 작성하면 되었다.

또 활동한 프로젝트나 동아리등을 세개씩밖에 적지 못해서 선별하느라 고생했다. (다 거기서 거기인 것 같아서?)

그렇게 서류지원 마감을 하고 기다렸더니 2주정도 뒤 서류발표가 났다

인적성 검사 및 코딩테스트

합격을 하고 나서 인적성 검사와 코딩테스트 일정을 선택해서 봤어야 했다.

지난 지 좀 돼서 정확히는 기억나지 않지만, 토요일과 일요일 선택할 수 있던걸로 기억한다.

나같은 경우는 인적성 검사는 토요일, 그리고 코딩테스트의 경우에는 일요일로 선택했다.

 

중요!! 인적성의 경우 하루 전에 미리 사전테스트를 진행하지 않으면 응시가 불가능하다.

실제로 이것 때문에 응시조차 못할뻔했다. 다들 잘 확인해서 사전테스트 하기를... 

 

lg전자의 경우 인성적성 그리고 코딩테스트 세 파트로 나뉘어 지는데, 다들 입모아 말하는게 “인성”검사가 제일 중요하다고 했다.

적성검사와 코딩테스트는 상대적으로 난이도가 쉽다라고 말을 들어서 따로 준비하지는 않았고 계속 기출문제를 풀고 코딩테스트의 경우에는 프로그래머스 2~3단계 문제들을 풀며 준비했다.

 

토요일의 인적성의 경우, 적성이 생각보다 할게 많고 어려워서 각 과목마다 5문제 이상씩을 찍은 것 같다.

그리고 적성을 보자마자 인성을 보게 되어서 멘탈이 나간 상태에서 인성검사를 했더니 제대로 했는지 의문이 들었다…

일요일의 코딩테스트는 생각보다 너무너무 쉬웠다!

토요일과 같이 3문제가 출제가 되었는데, 토요일의 경우에는 마지막 문제가 엄청 어려웠다고 했는데 일요일의 경우에는 너무 쉬워서 문제였다.

 

두시간에 세문제를 풀어야했는데 세문제를 전부 한시간도 안되는시간에 풀어버렸다.

원래 코딩테스트에 자신이 없었던 상황인데도 이렇게 되니깐 걱정이 되기 시작했다. 너무 쉬워서 감점이 조금이라도 되면 떨어질거같은 느낌이 들어서 예외처리를 찾기 위해서 남은시간동안 고생했다.

결국 2번과 3번문제에서 반례를 추가적으로 더 찾아내서 (내 생각에는) 거의 100% 풀어서 제출했다.

⇒ 코딩테스트는 잘 풀었다고 생각했지만, 인적성에서 잘 못푼것 같아서 굉장히 걱정했다

하지만 다행이게도 합격!

1차 면접

5월 8일 수요일 

온라인 Webex

소요시간 : PT발표(10분) + 질문(15분)

 

1차 면접의 경우 온라인으로 진행됐다.

양식에 맞게 PPT를 만들어서 PT 발표를 먼저 하고, 그 뒤 질문을 받는 방식이다.

사업본부에 따라서 영어 면접을 보는 경우도 있었지만 난 보지 않앗다.

 

우선 나같은 경우는 기본양식이 굉장히 안예쁘다고 생각해서 LG전자의 색인 빨강을 살려서 PPT를 제작했고, 또 기존의 구조도 바꿔서 영혼을 넣어 피피티를 완성했다.

 

실제 면접에서는 내가 직접 PPT 화면을 공유하면서 PT발표를 진행하였고 그 뒤 질문을 받는 방식으로 진행했다. 

PT발표를 마친 후 15분정도 PT발표에 대한 질문과 면접관분들이 하고 싶은 질문들을 받았다.

 

나같은 경우는 거의 PT발표에서 내가 진행했던 프로젝트와 관련한 질문들이 계속 나왔다.

그리고 전체적으로 무난한 질문들이 나왔다.

  • 자기소개 1분
  • pt발표
  • 앱이나 웹개발쪽을 많이 하셨는데, 대학시절의 어떤 과목에서 도움을 많이 받았는가
  • BS 사업본부 지원이유
  • 들어와서 무슨 일을 하고 싶은지
    • 실제 들어와서 어떤 일 하고 싶은지 구체적으로 생각해본 것
  • 임베디드 관련 과목도 수강한것이 있느냐
  • 리더로서 팀내에서 갈등경험이 있는가
  • lg 사옥 가본적 있느냐

이정도의 질문이 나온 것 같다.

2차 면접

5월 31일

대면 면접 (마곡 사이언스 파크)

소요시간 : 토의 면접 (1시간) + 임원면접 (1시간)

 

2차면접의 경우에는 사이언스파크에서 오프라인으로 진행했다.

4~5명씩 조가 존재했고, 각 조별로 토의 면접과 임원 면접을 돌았다.

 

토의 면접

토의 면접과 임원 면접 중 뭘 먼저 볼지는 랜덤이였는데 우리 조는 토의 면접을 먼저 봤다.

토의 면접에서는 어떠한 문제 상황에서 여러개의 선택할 수 있는 의견 중 하나를 선택하고 그에 대한 이유를 논리적으로 찾아서 발표하면 된다.

 

필요한 자료를 다 주고 그것을 처음에 읽는 시간도 준다.

여기서는 정답이 없다고 생각하고, 의견을 모으는 과정을 보는 것 같다.

내용 자체를 자세하게 이야기하면 안될 것 같으니 패스...

 

큰 부담 가지지말고 나의 의견도 피력하고 남의 말도 잘 들으면서 진행한다면 무난하게 넘길 수 있을 것 같다.

결국 지원자가 의사소통이 가능한지 확인하는것이라고 생각하기 때문에 문제를 일으킬 수준으로 자신의 주장을 강하게 한다던가, 상대의 의견에 비난을 한다던가 하지만 않으면 되는 것 같다.

 

임원 면접

토의 면접을 같이 본 그대로 임원 면접을 들어갔다.

면접관은 3분이 계셨고, 한분은 인사담당자 나머지는 사업본부 소속으로 보였다.

 

질문의 경우는 무난하게 자기소개부터 시작해서 자기소개서와 코딩테스트에서 궁금했던 부분들을 중점적으로 물어봤다.

공통 질문과 개인 질문 모두 모든 면접자에게 동일한 개수의 질문을 주셨고, 분위기를 굉장히 편하게 만들어주셔서 쉽게 말할 수 있었다.

하지만 같이 면접에 들어갔던 사람들이 너무 말을 잘해서 내심 망했다고 생각하고 있었다.

  • 3분 자기소개 해주세요
  • 왜 BS에 지원하였나요?
  • 왜 프로젝트 때 flutter를 사용하셨나요?
  • 들어와서 무엇을 하고 싶은지?
  • 본인이 개발을 하면서 가장 중요하게 생각하는 가치?
  • 플레이 스토어에 배포하셨던 경험이 있네요. 어떤 점이 제일 어려웠나요?
  • 취업 준비 하면서 가장 힘들었던 점이 무엇인가요?
  • 마지막으로 하고 싶은말

최종 합격

면접을 보고 2주 뒤 슬슬 잊어갈 때 2차 면접 합격을 받앗다.

사실 잘 못봐서 떨어질 줄 알았는데, 이걸 붙네..

 

 

사실 2차 면접 합격이면 사실상 최종 합격이다.

건강검진이 남았지만 여기서 떨어질 정도면 생명에 지장이 있는 병이 존재하는거여서 걱정 안하면 된다.

하지만 그래도 떨리는건 어쩔 수 없지

사실 이렇게 원래 나오기로 한 날짜보다 밀리면서 진짜 떨렸지만 그래도 최종합격을 할 수 있었다.

문제 상황

  • 프로젝트를 진행하면서 첫 로그인 시 이용약관 동의를 받아야 하는 상황이 생겼다.
  • 학교 관련서비스로 학교 로그인 api를 사용하기 때문에 학번을 id로 사용한다 . 그래서 학번을 기준으로 첫 로그인을 판단해야한다.
  • 현재 프로젝트가 백엔드리스 프로젝트로 존재했기 때문에 “어떻게 첫 로그인을 감지할까?”라는 문제상황이 있었다.

해결 방법

  • 현재 배포를 firebase를 github ci/cd와 붙여서 사용중인데, firestore를 사용해서 학번을 저장하는 방법으로 첫 로그인을 감지하자
  • firestore의 경우에는 콜렉션, 문서, 필드로 이루어진 noSql 형식의 db이다.

(첫 로그인 시)

  1. 로그인 시 firestore의 users 콜렉션을 확인하여 문서에 해당하는 학번이 존재하는지 확인한다.
  2. 존재하지 않으면 첫 로그인 이므로 약관 동의 페이지로 리다이렉션한다.
  3. 약관을 읽고 동의 버튼을 누르는 경우 firestore의 users 콜렉션에 학번을 기준으로 문서를 생성한다.

(두번 째 부터)

  1. 로그인 시 firestore의 users콜렉션에 학번이 존재하는 경우 메인페이지로 리다이렉션한다.

1. firestore생성

2. next.js 프로젝트와 연결

3. firestore의 문서 조회 및 생성으로 첫 로그인을 감지해 약관동의 페이지 리다이렉션 로직 구축

1. firebase의 firestore 추가 및 sdk 값 얻기

  • firebase에 firestore database를 해당하는 프로젝트 이름으로 추가한다.

  • 그 후 firebase에 웹앱을 추가하고 sdk값을 받는다.

2. 프로젝트에 firebase 추가

  • 프로젝트에 firebase를 추가해준다.
# npm 사용 시
npm install firebase
# yarn 사용 시
yarn add firebase

# typescript 사용 시 의존성 부여
npm install --save-dev @types/firebase
yarn add --save-dev @types/firebase
  • 위에서 얻었던 sdk값을 넣은 firebase.js(ts)파일을 루트 디렉토리에 만들어준다.
// 프로젝트 디렉토리의 root에
// firebase.js or firebase.ts
import { initializeApp } from 'firebase/app';
import { getFirestore } from 'firebase/firestore';

const firebaseConfig = {
  apiKey: '',
  authDomain: '',
  projectId: '',
  storageBucket: '',
  messagingSenderId: '',
  appId: '',
  measurementId: '',
};

const app = initializeApp(firebaseConfig);
const db = getFirestore(app);

export { db };

⇒ 이제 firestore과 연결이 완료되어서 사용할 수 있다.

3. 로그인 시 약관동의 페이지로 리다이렉션하기

  • 우선 id값을 받아, 그 id가 firestore의 users 컬렉션 내부에 존재하는 문서값인지 확인하는 함수를 작성한다.
import { doc, getDoc, setDoc } from 'firebase/firestore';
import { db } from '../../../firebase';

export const checkStudentExists = async (
  studentId: string,
): Promise<boolean> => {
  const studentRef = doc(db, 'users', studentId);
  const docSnap = await getDoc(studentRef);
  return docSnap.exists();
};
  • 그런 후 기존의 로그인 로직에서 로그인 성공 시 위에서 작성한 함수를 사용해 약관동의를 받아야할 경우 약관동의 페이지로, 그렇지 않으면 메인페이지로 라우팅을 해준다.
  const handleLogin = async (id: string, password: string) => {
    try {
        .
        .
        . // 로그인 처리하는 로직들

            // firestore의 id값이 존재하는지 확인
      const studentExists = await checkStudentExists(id);
      if (studentExists === false) {
        router.replace('/tos'); // 존재하지 않을 경우 약관동의 페이지로 이동
      } else {
        router.replace('/'); // 존재할 경우 메인페이지로 이동
      }
      return data;
    } catch (err) {

    }

약관동의 시 firestore에 새로운 문서 생성

  • irestore의 users 콜렉션 아래에 id값으로 문서 생성하는 함수 작성
import { doc, getDoc, setDoc } from 'firebase/firestore';
import { db } from '../../../firebase';

export async function createStudent(
  studentId: string,
  userData: Record<string, boolean>,
): Promise<void> {
  const studentRef = doc(db, 'users', studentId);
  try {
    await setDoc(studentRef, userData, { merge: true });
  } catch (error) {
    console.error('Error writing document: ', error);
  }
}
  • 약관동의 버튼 클릭 시 위의 함수 사용해서 문서 id값, 그리고 내부 데이터를 {”isCheckTos”:true}로 새로운 문저 생성
const handleAgree = () => {
    const user = getUserInfo();
    createStudent(user.sId, { isCheckTos: true });
    router.push('/');
  };

⇒ 이렇게 될 경우 이제 최초 로그인시에만 약관동의 페이지가 떠오르고, 약관 동의를 한 후에는 다시 로그인한다해도 바로 메인페이지로 넘어가게 된다.

결과

1. 첫 로그인 시

2. 첫 로그인이 아닐 때 (약관동의 후)

디스코드 웹훅 설정

  • 우선 디스코드의 서버 설정에 들어가서 앱 → 연동 부분을 클릭 한다.

  • 연동 부분에 들어가면 “웹후크” 부분을 클릭한다.

  • 새로운 웹후크를 생성하고 이름을 정해준 후 해당 알림을 받을 채널을 설정한다.→ 그런 후 “웹후크 URL 복사” 버튼을 클릭해서 URL을 복사한다.

깃허브 프로젝트 설정

  • 우선 알림을 받을 repository의 setting 란으로 들어간다.

  • 그러고 나서 code and automation에서 Webhooks 탭을 클릭한다.

  • add webhook을 클릭 한다.

  • 아까 디스코드에서 복사한 webhook 주소를 Payload URL을 붙여 넣은뒤 “/github”라는 문자열을 추가한다.
[디스코드에서 복사한 webhook]/github

  • 그러고 나서 Which events would you like to trgger this webhook? 란에서 어떤 행동들을 알림을 줄지 선택할 수 있다.

  • 이렇게 PR만 추가할 수 있다.

결론

  • 제대로 추가했다면 알림이 잘 오게 된다.

 

'기타' 카테고리의 다른 글

2024 상반기 LG전자 SW 합격 후기  (1) 2024.10.09
소프트웨어 마에스트로 13기 합격후기  (1) 2023.10.01

문제

 

27440번: 1로 만들기 3

첫째 줄에 1보다 크거나 같고, 1018보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net

코드

from collections import deque
def bfs(n):
    q = deque([(n, 0)])
    visited = set([n]) 
    while q:
        cur, count = q.popleft()
        if cur == 1:
            return count
        if cur % 3 == 0 and (cur // 3) not in visited:
            q.append((cur // 3, count + 1))
            visited.add(cur // 3)
        if cur % 2 == 0 and (cur // 2) not in visited:
            q.append((cur // 2, count + 1))
            visited.add(cur // 2)
        if (cur - 1) not in visited:
            q.append((cur - 1, count + 1))
            visited.add(cur - 1)
    return -1  
n=int(input())
print(bfs(n))

풀이

  1. n을 입력받는다.
  2. 입력받은 n을 bfs함수에 넣고 돌려준다. 문제에서 주어진 조건을 만족하면 q에 넣는다.
    • X가 3으로 나누어 떨어지면, 3으로 나눈다.
    • X가 2로 나누어 떨어지면, 2로 나눈다.
    • 1을 뺀다.
  3. 단 n의 크기가 최대 10^18로 엄청 크다. 그러므로 최대한 중복된 값을 탐색하지 않기 위해서 visited라는 set()을 선언한다.
  4. 매번 얻는 값들을 visited에 넣어주고, bfs 시행 시 조건을 만족해도 visited에 있는 수들은 q에 넣지 않는다.(중복을 피한다)
  5. 1이 되면 횟수를 return한다.

'알고리즘' 카테고리의 다른 글

[백준] 2096 내려가기 python  (0) 2024.03.19
[백준] 9456 스티커 python  (2) 2024.03.18
[백준] 15663 N과M (9) python  (0) 2024.03.18
[프로그래머스] 여행경로 python  (2) 2024.03.12
[백준] 1063 킹 python  (4) 2024.03.06

문제

 

 

2096번: 내려가기

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.

www.acmicpc.net

코드

import sys
import copy
input = sys.stdin.readline
n= int(input())
# dp배열을 쓰고 싶지만 메모리가 부족하여 현재층과 바로 위층에 사용한 배열만 초기화
bq=[[0,0],[0,0],[0,0]]
cq=[[0,0],[0,0],[0,0]]
for i in range(n):
    arr=list(map(int,input().split()))
    #최대값 구하기
    cq[0][0]=max(bq[0][0],bq[1][0])+arr[0]
    cq[1][0]=max(bq[0][0],bq[1][0],bq[2][0])+arr[1]
    cq[2][0]=max(bq[1][0],bq[2][0])+arr[2]

		#최소값 구하기
    cq[0][1]=min(bq[0][1],bq[1][1])+arr[0]
    cq[1][1]=min(bq[0][1],bq[1][1],bq[2][1])+arr[1]
    cq[2][1]=min(bq[1][1],bq[2][1])+arr[2]
    bq=copy.deepcopy(cq)
resMax=0
resMin=100000000
for i in range(3):
    resMax=max(resMax,max(bq[i]))
    resMin=min(resMin,min(bq[i]))
print(resMax,resMin)

풀이

  • 간단한(하지만 조건있는) dp 문제
  • 메모리가 굉장히 작으므로, 전체를 저장하는게 아닌 사용하는 부분을 계속 업데이트 하는 방식으로 푼다.
  1. 높이 n을 입력받는다.
    • dp 문제이지만 여기서 메모리 크기가 4mb이다. 그러므로 층을 한층씩 내려가면서 본다.
    • 각 층에서 내려갈 수 있는 부분은 인접해 있는 부분이기 때문에 거꾸로 밑층에서도 인접한 곳에서만 올 수 있다.
    • 그러므로 dp[i][0] (왼쪽) : dp[i-1][0] (왼쪽 위), dp[i-1][1] (가운데 위) 중 하나 dp[i][1] (가운데쪽) : dp[i-1][0] (왼쪽 위), dp[i-1][1] (가운데 위), dp[i-1][2] (오른쪽 위) 중 하나 dp[i][2] (오른쪽) : dp[i-1][1] (가운데 위), dp[i-1][2] (오른쪽 위) 중 하나 이다.
    • 최소값과 최대값을 둘다 구하므로, 각각의 위치에 최소,최대를 둘다 구해서 표시해준다.
    • 현재 층(cq)과 바로 위층(bq)만을 사용하고, 다음 층으로 넘어가면 bq=cq로 업데이트 해준다.n만큼 한층씩 내려가면서 최대값과 최솟값을 기록하면서 내려간다.

2. 반복문을 전부 돌고, 1층에서의 최대값과 최소값을 찾아서 출력한다.

특이사항

  • dp의 점화식은 대놓고 문제에서 그림으로 주지만, 메모리가 굉장히 제한적이여서 쉽지 않은 문제였다.
  • dp배열을 cq와 bq로 바꿨는데도 메모리 초과→ 입력받는 arr도 한줄씩 받게 변경 → 시간초과가 나서 sys로 입력속도 빠르게함 → 성공

'알고리즘' 카테고리의 다른 글

[백준] 27440 1로 만들기 3 python  (0) 2024.03.19
[백준] 9456 스티커 python  (2) 2024.03.18
[백준] 15663 N과M (9) python  (0) 2024.03.18
[프로그래머스] 여행경로 python  (2) 2024.03.12
[백준] 1063 킹 python  (4) 2024.03.06

문제

 

9465번: 스티커

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의

www.acmicpc.net

코드

T = int(input())
for _ in range(T):
    N = int(input())
    arr = [list(map(int,input().split()))]
    arr.append(list(map(int,input().split())))
    res=[[0 for _ in range(N+1)] for _ in range(2)]
    for i in range(N):
        if(i==0):
            res[0][i+1]=arr[0][i]
            res[1][i+1]=arr[1][i]
            continue
        res[0][i+1]=max(res[1][i]+arr[0][i],res[1][i-1]+arr[0][i])
        res[1][i+1]=max(res[0][i]+arr[1][i],res[0][i-1]+arr[1][i])
    print(max(max(res[0]),max(res[1])))

풀이

  1. 시행횟수 T와 스티커사진의 길이 N, 그리고 각 스티커의 점수를 입력 받는다.
  2. 입력 받은 스티커 사진을 조건에 맞게 찢어서 최대 점수를 얻는 방법을 구한다. (res배열은 해당 위치 최고 점수의 합)1 2
    1 2  
        3
    1. 우선 첫번째 위치의 경우에는 온전히 res배열에 그 스티커의 점수를 저장한다.
    2. 두번째부터 점화식을 세워서 구해준다.
    3. 위의 표처럼 이런 상황에서 3의 최대값을 구하려면 우선 (2까지의 점수합 + 3의 점수)이 있다. 그리고 또한 스티커를 뗀 부분의 상하좌우를 못쓰게 되므로 만약 1까지의 점수합이 더 크다면 (1까지의 점수합 + 3의 점수) 의 경우가 존재한다. 즉 max((2까지의 점수합 + 3의 점수), (1까지의 점수합 + 3의 점수))을 구하게 된다면 해당 위치의 스티커의 최대점수를 얻을 수 있다.
    4. 끝까지 최대점수를 구한뒤 max()함수를 사용하여 최대값을 구한 후 출력해준다.

'알고리즘' 카테고리의 다른 글

[백준] 27440 1로 만들기 3 python  (0) 2024.03.19
[백준] 2096 내려가기 python  (0) 2024.03.19
[백준] 15663 N과M (9) python  (0) 2024.03.18
[프로그래머스] 여행경로 python  (2) 2024.03.12
[백준] 1063 킹 python  (4) 2024.03.06

문제

 

15663번: N과 M (9)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

코드

N,M = map(int,input().split())
check = [0 for _ in range(N)]
arr = list(map(int,input().split()))
res=set([])
arr.sort()

def solve(cur,count):
    if count==M:
        res.add(tuple(cur))
    for i in range(N):
        if(check[i]!=0):
            continue
        cur.append(arr[i])
        check[i]=1
        solve(cur,count+1)
        check[i]=0
        cur.pop()

solve([],0)
res=list(res)
a=len(res[0])
res.sort(key=lambda x : tuple(x[i] for i in range(a)))
for i in res:
    tmp = tuple(str(j) for j in i)
    print(str(" ").join(tmp)

풀이

  1. N,M을 입력받고 N크기의 배열 arr을 입력받는다.
  2. check 배열을 만들어주고, arr을 오름차순으로 정렬해준다.
  3. solve함수를 호출한다.
    1. solve함수에서 M의 크기를 만들기 위해서 check로 중복된 값을 제외하고 solve를 재귀호출 해준다.
    2. 만약 count==M이면 원하는 크기이므로 res배열에 추가해준다. 단, arr에 중복된 수가 있어서 결과가 중복될 수 있으므로 res는 set자료형을 사용해서 중복을 방지한다. set 자료형은 변경가능한 list를 넣지 못하므로 tuple로 바꿔서 넣어준다.
  4. solve함수를 다 수행한 후 결과값을 list로 다시 만들어주고 정렬을 해준다.
    1. 정렬을 해줄 때 M의 개수에 따라 정렬 기준이 달라지므로 lambda를 사용할 때 M의 크기만큼 앞에서부터 차례대로 정렬기준을 잡아준다.
  5. 정렬을 완료했으면 출력한다.

'알고리즘' 카테고리의 다른 글

[백준] 2096 내려가기 python  (0) 2024.03.19
[백준] 9456 스티커 python  (2) 2024.03.18
[프로그래머스] 여행경로 python  (2) 2024.03.12
[백준] 1063 킹 python  (4) 2024.03.06
[백준] 25709 1 빼기 python  (0) 2024.02.29

문제

 

프로그래머스

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

programmers.co.kr

코드

def solution(tickets):
    tickets.sort(reverse=True)
    routes = {}
    
    for start,end in tickets:
        if start in routes:
            routes[start].append(end)
        else:
            routes[start] = [end]
    stack = ["ICN"]
    path = []
    
    while stack:
        top = stack[-1]
        if top in routes and routes[top]:
            stack.append(routes[top].pop())  
        else:
            path.append(stack.pop())  
    
    return path[::-1]  
    

풀이

  • 주어진 비행기표를 다 사용한 후 여행경로를 출력해라
  1. 알파벳 순서가 빠른것을 먼저 출력하라고 했기 때문에 tickets을 역순으로 정렬
  2. 우선 routes라는 딕셔너리를 만들어 출발지는 key로 목적지는 value로 만들어준다.
  3. stack 으로 사용할 배열에 제일 첫번째에 “ICN”을 넣어주고, while문을 돌린다.
  4. while문을 돌리면서 갈 경로가 있으면 스택에 추가해주고, 아니면 stack에서 꺼내 path에 추가한다
  5. 마지막 역순으로 되어있는 경로를 뒤집어서 출력해준다.

'알고리즘' 카테고리의 다른 글

[백준] 9456 스티커 python  (2) 2024.03.18
[백준] 15663 N과M (9) python  (0) 2024.03.18
[백준] 1063 킹 python  (4) 2024.03.06
[백준] 25709 1 빼기 python  (0) 2024.02.29
[백준] 1535 안녕 python  (1) 2024.02.28

+ Recent posts