손 코딩 문제 | 코딩테스트 효율적으로 준비하는 방법 | 손코딩 고민시간 11 개의 가장 정확한 답변

당신은 주제를 찾고 있습니까 “손 코딩 문제 – 코딩테스트 효율적으로 준비하는 방법 | 손코딩 고민시간“? 다음 카테고리의 웹사이트 https://you.charoenmotorcycles.com 에서 귀하의 모든 질문에 답변해 드립니다: https://you.charoenmotorcycles.com/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 큰돌의터전 이(가) 작성한 기사에는 조회수 2,432회 및 좋아요 73개 개의 좋아요가 있습니다.

Table of Contents

손 코딩 문제 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 코딩테스트 효율적으로 준비하는 방법 | 손코딩 고민시간 – 손 코딩 문제 주제에 대한 세부정보를 참조하세요

[C++ 10주완성 코딩테스트] https://blog.naver.com/jhc9639/222602625841
[CS지식의 정석] https://www.inflearn.com/course/%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%A9%B4%EC%A0%91-cs-%ED%8A%B9%EA%B0%95?inst=16252dc2

손 코딩 문제 주제에 대한 자세한 내용은 여기를 참조하세요.

기술 면접 – 손코딩 :: 하고싶은거 다 해

1. 스택 구현 · 2. 큐 구현 · 3. 연결리스트 구현 · 4. 해시테이블 구현 · 5. 싱글턴 패턴 구현 · 6. 피보나치 · 7. 팩토리얼 · 8. 랜덤 한 자리 숫자 10개 출력 …

+ 여기에 보기

Source: ltk3934.tistory.com

Date Published: 5/22/2021

View: 1937

자바 면접 손코딩 예상 문제 – KTKO 개발 블로그와 여행 일기

자바 면접 손코딩 예상 문제 · 1. 재귀를 이용한 피보나치(fibo 함수) · 2. 메모이제이션을 이용한 피보나치(memoFibo 함수) · 3. 재귀를 이용한 팩토리얼 …

+ 여기를 클릭

Source: ktko.tistory.com

Date Published: 12/2/2022

View: 8358

신입 JAVA 웹 프로그래머 기술 면접 시 예상 질문 & 코딩 테스트

시험 보듯이 객관식 문제를 여러 개 주는 곳, 주관식 문제를 주는 곳, 손 코딩을 시키는 곳 등 다양하니 꾸준히 공부하시고 면접 전에 잡플래닛에서 해당 …

+ 자세한 내용은 여기를 클릭하십시오

Source: m.blog.naver.com

Date Published: 9/24/2021

View: 6755

손코딩 테스트 문제 – 뷰티풀 프로그래밍

[김경록] [오후 2:50] 최소한 이정도를 알아야 문제를 손을 대볼수가 있엉 풀수 있다는게 아님 ㅜㅜ. 손코딩 테스트 … 입문용 코딩테스트 비디오

+ 여기에 보기

Source: krksap.tistory.com

Date Published: 12/2/2021

View: 9959

정보처리기사 손코딩 문제 – 병아리 개발자

정보처리기사 손코딩 문제. # C언어. ## C언어 소스 코드, 홀수와 짝수를 출력하는 코드, 밑줄에 들어갈 조건문은? #include vo main() …

+ 여기에 자세히 보기

Source: dlagusgh1.tistory.com

Date Published: 11/22/2021

View: 6472

문과생인 내가 개발자가 되기까지 #5 (마지막) – Woogear’s Blog

그래서 알고리즘 시험을 대비해 조금씩 자료구조를 공부하고 알고리즘 문제도 풀기시작했다. 마지막은 흔히 손코딩이라고 하는 방식이다. 필기도구를 …

+ 여기에 표시

Source: devwooks.tistory.com

Date Published: 4/25/2022

View: 752

손코딩 면접 준비 – Squared

재귀를 이용한 피보나치 메모이제이션을 이용한 피보나치 재귀를 이용한 팩토리얼 문제 10회 1~10까지 랜덤한 숫자를 출력하여 중복된 숫자가 있을 …

+ 여기에 자세히 보기

Source: n-square.tistory.com

Date Published: 6/14/2022

View: 1495

저의회사에서 신입을 뽑기로 했습니다…. – OKKY

그런데 코딩테스트를 하라고 하시는데. … 제가 얼마전 신입면접 보러가서 손코딩 받은 문제가 1부터 1000까지 3이나 5의 배수 합 구하기 였어용!

+ 더 읽기

Source: okky.kr

Date Published: 6/21/2021

View: 4845

손코딩, 라이브코딩테스트(라이브코테) 면접 관련 대비

손코딩, 라이브코테는 예로 자료구조는 퀵정렬, 삽입정렬 등 정렬이 나오는 편입니다. 또한 알고리즘은. 스택 두개주고 큐만들기, 소수문제, …

+ 더 읽기

Source: garden1500.tistory.com

Date Published: 9/11/2022

View: 9936

개발자 면접 시 손코딩 테스트란? – Flat Sun

개발자 자체서비스 면접 시 간간히 손코딩을 하라고 하는 경우가 있던데 지금 떠올려보면 이게 제일 힘들었던 것 같다 먼저 손코딩이란 보드마카 하나 …

+ 여기에 표시

Source: flatsun.tistory.com

Date Published: 7/27/2021

View: 3143

주제와 관련된 이미지 손 코딩 문제

주제와 관련된 더 많은 사진을 참조하십시오 코딩테스트 효율적으로 준비하는 방법 | 손코딩 고민시간. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

코딩테스트 효율적으로 준비하는 방법 | 손코딩 고민시간
코딩테스트 효율적으로 준비하는 방법 | 손코딩 고민시간

주제에 대한 기사 평가 손 코딩 문제

  • Author: 큰돌의터전
  • Views: 조회수 2,432회
  • Likes: 좋아요 73개
  • Date Published: 2022. 6. 28.
  • Video Url link: https://www.youtube.com/watch?v=D-y_WxzsZ2Q

하고싶은거 다 해 하고싶은거 다 해

1. 스택 구현

2. 큐 구현

3. 연결리스트 구현

4. 해시테이블 구현

5. 싱글턴 패턴 구현

스레드 세이프 싱글턴 패턴

class Singleton { private Singleton() {} public static Singleton getInstance() { return LazyHolder.INSTANCE; } private static class LazyHolder { private static final Singleton INSTANCE = new Singleton(); } }

6. 피보나치

public class Fibonacci { static int[] cache = new int[11]; public static void main(String[] args) { System.out.println(loopFibonacci(8)); System.out.println(recurFibonacci(8)); System.out.println(dpFibonacci(8)); } public static int loopFibonacci(int n) { int a = 0, b = 1, c = 0; if(n == 0) return 0; else if(n == 1) return 1; else { for (int i = 2; i <= n; i++) { c = a + b; a = b; b = c; } } return c; } public static int recurFibonacci(int n) { if(n == 0) return 0; if(n == 1) return 1; return recurFibonacci(n - 1) + recurFibonacci(n - 2); } public static int dpFibonacci(int n) { if(n == 0) return 0; if(n == 1) return 1; int ret = cache[n]; if(ret != 0) return ret; return cache[n] = dpFibonacci(n - 1) + dpFibonacci(n - 2); } } 7. 팩토리얼 public class Factorial { static int[] cache = new int[10]; public static void main(String[] args) { System.out.println(loopFactorial(5)); System.out.println(recurFactorial(5)); System.out.println(dpFactorial(5)); } // 반복문으로 풀이 public static int loopFactorial(int n) { int ret = 1; for(int i = 1; i <= n; i++) { ret *= i; } return ret; } // 재귀함수로 풀이 public static int recurFactorial(int n) { if(n == 1) return 1; return n * recurFactorial(n - 1); } // 재귀함수 + 메모이제이션 풀이 public static int dpFactorial(int n) { if(n == 1) return 1; int ret = cache[n]; if(ret != 0) return ret; return cache[n] = n * dpFactorial(n - 1); } } 8. 랜덤 한 자리 숫자 10개 출력 Random 클래스 사용 public class RandomClass { public static void main(String[] args) { Random random = new Random(); for(int i = 0; i < 10; i++) { System.out.println(random.nextInt(9) + 1); } } } 9. 아나그램 판별 정렬해서 같은지 판별 import java.util.Arrays; public class Anagram { public static void main(String[] args) { char[] a = "acdbe".toCharArray(); char[] b = "ecabd".toCharArray(); Arrays.sort(a); Arrays.sort(b); if(Arrays.equals(a, b)) System.out.println(true); else System.out.println(false); } } 10. 문자열 안에 문자들이 고유한 문자인지 확인 유니코드라도 돌아가는 코드 아스키 코드일 때 최적화하려면 128칸 불린 배열을 사용할 수도 있음 static HashSet hs = new HashSet<>(); public static boolean isUnique(String str) { char[] arr = str.toCharArray(); for(int c : arr) { if(hs.contains(c)) return false; hs.add(c); } return true; }

11. 최소 공배수, 최대 공약수

// 유클리드 호제법 // 최소공배수 = (n1 * n2) / (n1과 n2의 최대공약수) public class GCD_LCM { public static void main(String[] args) { System.out.println(gcd(8, 12)); int LCM = (8 * 12) / gcd(8, 12); System.out.println(LCM); } public static int gcd(int a, int b) { if(b == 0) return a; return gcd(b, a % b); } }

13. 이진 트리 순회

public class TreeTraversal { class Node { int data; Node left, right; public Node(int data) { this.data = data; } } class Tree { public Node root; public void setRoot(Node node) { root = node; } public Node getRoot() { return root; } public Node createNode(int data, Node left, Node right) { Node node = new Node(data); node.left = left; node.right = right; return node; } //중위 순회 public void inOrder(Node node) { if(node == null) return; inOrder(node.left); System.out.println(node.data); inOrder(node.right); } //전위 순회 public void preOrder(Node node) { if(node == null) return; System.out.println(node.data); preOrder(node.left); preOrder(node.right); } //후위 순회 public void postOrder(Node node) { if(node == null) return; postOrder(node.left); postOrder(node.right); System.out.println(node.data); } } }

14. 진수 변환

public class Radix { public static void main(String[] args) { changeRadix(2556, 16); } public static void changeRadix(int n, int radix) { int[] num = new int[100]; int idx = 0; while(n > 0) { num[idx] = n % radix; n /= radix; idx++; } idx–; for(;idx >= 0; idx–) { if(num[idx] < 10) System.out.printf("%c", num[idx] + 48); else System.out.printf("%c", num[idx] + 55); } } } 15. 1000보다 작은 숫자 중 3과 5의 배수의 총합 public static void main(String[] args) { int sum = 0; for(int n = 1; n < 1000; n++) { if(n % 3 == 0 || n % 5 == 0) sum += n; } System.out.println(sum); } 16. 문자열 역순 변환 public static void main(String[] args) { String str = "abcdefg"; StringBuilder sb = new StringBuilder(str); sb.reverse(); System.out.println(sb); } 17. 문자열에서 모음만 거꾸로 public static void main(String[] args) { String str = "bacedufivo"; StringBuilder sb = new StringBuilder(str); HashSet vowel = new HashSet<>(); vowel.add(‘a’); vowel.add(‘e’); vowel.add(‘i’); vowel.add(‘o’); vowel.add(‘u’); int left = 0, right = str.length() – 1; while(left < right) { while(!vowel.contains(str.charAt(left))) left++; while(!vowel.contains(str.charAt(right))) right--; sb.setCharAt(left, str.charAt(right)); sb.setCharAt(right, str.charAt(left)); left++; right--; } System.out.println(sb); } 18. 문자열에 있는 단어 순서 바꾸기 public static void main(String[] args) { String str = "Hello I am a developer"; String[] arr = str.split(" "); for(int i = arr.length - 1; i >= 0; i–) System.out.print(arr[i] + ” “); }

19. 비트 1 개수 카운트

public static void main(String[] args) { int n = 1024; int cnt = 0; while(n > 0) { n &= n – 1; cnt++; } System.out.println(cnt); }

20. N크기의 정수 배열에서 K번째로 큰 수

Quick Selection 사용

보통 정렬을 사용하면 O(NlgN), 이 방법은 O(N)

static int K = 4; static int ret = -1; public static void main(String[] args) { int[] arr = {3, 5, 2, 4, 1}; QuickSelection(arr, 0, arr.length – 1); System.out.println(ret); } public static void QuickSelection(int[] arr, int left, int right) { int pivot = partition(arr, left, right); if(pivot == K – 1) { ret = arr[pivot]; } else if(pivot > K – 1) { QuickSelection(arr, left, pivot – 1); } else { QuickSelection(arr, pivot + 1, right); } } public static int partition(int[] arr, int left, int right) { int mid = (left + right) / 2; swap(arr, left, mid); int i = left, j = right; int pivot = arr[left]; while (i < j) { while(arr[j] >= pivot) j–; while(i < j && arr[i] <= pivot) i++; swap(arr, i, j); } arr[left] = arr[i]; arr[i] = pivot; return i; } public static void swap(int[] arr, int a, int b) { int tmp = arr[a]; arr[a] = arr[b]; arr[b] = tmp; }

KTKO 개발 블로그와 여행 일기

유튜브, 책, 구글검색, OKKY 토대로 작성해보았다. 추후 발견할 때마다 업데이트를 할 예정…. 신입 또는 경력의 문제가 포함(경력 치고는 너무 쉬운 문제가 있을 수도 있지만 면접시간이 길지 않기 때문에 쉬운 문제로 출제되는 케이스가 있었음)

1. 재귀를 이용한 피보나치(fibo 함수) 2. 메모이제이션을 이용한 피보나치(memoFibo 함수) 3. 재귀를 이용한 팩토리얼 문제( fact 함수) 4. 10번 동안 1~10까지 랜덤한 숫자를 출력하여 중복된 숫자가 있을 경우 true, false를 리턴하라( randomQuiz) (판교의 어느 대기업 손코딩 문제) 그닥 어렵지 않은 문제 랜덤함수 범위만 지정할 줄 알면 매우 쉬운 것 같다. int a = (int)(Math.random()*10)+1; //1 ~ 10 랜덤 함수 뽑아내기

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 public final class CodingExample { public static int []table; public static void main( String [] args) { table = new int [ 7 + 1 ]; // System.out.println(fibo(7)); // System.out.println(memoFibo(7)); // System.out.println(fact(5)); randomQuiz(); } //피보나치 public static int fibo( int data) { if (data < = 1 ) { return 1 ; } return fibo(data - 1 ) + fibo(data - 2 ); } //피보나치 public static int memoFibo( int data) { if (data < = 1 ) { table[data] = 1 ; return 1 ; } if (table[data] > 0 ) { return table[data]; } table[data] = memoFibo(data – 1 ) + memoFibo(data – 2 ); return table[data]; } //factorial public static int fact( int data) { if (data < = 1 ) return 1 ; return fact(data - 1 ) * data; } //Math.Random(); public static void randomQuiz() { for ( int i = 0 ; i < 50 ; i + + ) { int randomValue = ( int )(Math.random() * 10 ) + 1 ; System . out . println (randomValue); } } } 5. 각종 정렬 면접 시간에 따라 다르겠지만 짧다면 (삽입, 버블, 선택) 길다면(힙, 퀵, 합병)정렬을 예상한다. 블로그를 참조하면 된다. 6. 각종 자료구조 구현해보기(Stack, Queue, HashTable, LinkedList) 등등 블로그를 참조하면 된다. 7. Anagram 아나그램이란 ? 서로 다른 두 문자열이 있을때 두 문자열의 알파벳을 재배열하였을때 같은 단어 혹은 문장. 예를 들어, apple과 ppale는 아나그램 abcd와 bacd는 아나그램 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public static boolean checkAnagram( String str1, String str2) { //공백 제거 str1 = str1.replaceAll( "\\s" , "" ); str2 = str2.replaceAll( "\\s" , "" ); //미리 문자열의 길이가 같은지 계산하여 1차적인 결과 수행 if (str1. length () ! = str2. length ()) { return false ; } // 두 단어다 소문자로 변환 후 char 형식으로 변환해주는 toCharArray() 메서드 활용 char [] char1 = str1.toLowerCase().toCharArray(); char [] char2 = str2.toLowerCase().toCharArray(); // Arrays.sort()를 이용하여 정렬을 한다. Arrays.sort(char1); Arrays.sort(char2); // String 비교를 위해 character 배열을 String으로 변환한다. String _str1 = new String (char1); String _str2 = new String (char2); // 비교한 결과를 리턴한다. return _str1. equals (_str2); } 8. 문자열 안에 문자들이 고유한 문자인지 확인 주어진 문자열의 문자들이 모두 고유한지를 확인하는 함수를 구현하시오. 담당자에게 질문해야할 것은 ? 해당 문자열이 아스키인지 유니코드를 포함하는지 확인을 해야한다.아스키일경우 128개의 배열을 사용해야한다. Unicode는 2의 20승 + 2의 16승의 1,114,112개의 문자를 가지기 때문에 자바의 HashMap을 구현해야한다. 아스키 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public boolean isUnique( String str) { if (str. length () > 128 ) return false ; boolean [] char_set = new boolean [ 128 ]; for ( int i = 0 ; i < str. length (); i + + ) { int val = str. charAt (i); if (char_set[val]) { return false ; } char_set[val] = true ; } return true ; } 유니코드 1 2 3 4 5 6 7 8 9 10 11 12 13 public boolean isUnique( String str) { HashMap < Integer, Boolean > hashMap = new HashMap < Integer, Boolean > (); for ( int i = 0 ; i < str. length (); i + + ) { int ch = str. charAt (i); if (hashMap.containsKey(ch)) { return false ; } hashMap.put(ch, true ); } return true ; } 9. 최소공배수 최소공약수 구하기 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public class CommonNumber { static int a, b; public static void main( String [] args) { // TODO Auto-generated method stub Scanner scan = new Scanner ( System . in ); a = scan.nextInt(); b = scan.nextInt(); if (b > a) { int temp = b; b = a; a = temp; } int result = gcd(a, b); System . out . println (result); System . out . println (a * b / result); } public static int gcd( int a, int b) { if (a % b = = 0 ) return b; return gcd(b, a % b); } }

추후 지속적인 업데이트 !!

신입 JAVA 웹 프로그래머 기술 면접 시 예상 질문 & 코딩 테스트

– 객체지향에 대해 설명해보세요

: 캡상추다(캡슐화 / 상속 / 추상화 / 다형성)으로 코드의 재사용성을 높이고 코드의 관리가 용이하고 제어자와 메서드를 이용하여 데이터를 보호하는데 좋으며 코드의 중복을 제거하여 코드의 불일치로 인한 오류를 방지할 수 있다. (클래스 = 설계도 / 객체 = 제품) ex_ TV설계도&TV, 붕어빵 기계 & 붕어빵

* 캡슐화 : 데이터 보호 / 불필요한 부분을 감출 수 있다. (접근 제어자 / 인터페이스 등)

* 상속 : 기존의 클래스를 재사용해서 새로운 클래스를 작성하는 것 (class 자손클래스 extends 조상클래스 {…})

* 추상화 : 추상클래스 / 추상메서드 / 인터페이스를 예로 설명

* 다형성 : 하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것 ( 조상타입의 참조변수로 자손타입의 개체를 다룰 수 있는 것 )

– 오버로딩 & 오버라이딩 차이는?

: 오버로딩은 하나의 클래스에 같은 이름의 메서드를 여러 개 정의하는 것을 말하며, 오버라이딩은 조상클래스로부터 상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것을 말한다.

* 오버로딩 조건

ⓐ 메서드의 이름이 같아야 한다.

ⓑ 매개변수의 개수 or 타입이 달라야 한다. (리턴타입은 오버로딩 구현과 관계 없다)

* 오버라이딩(조상에게 받은 메서드의 구현부를 바꿈) 조건

ⓐ 선언부가 같아야 한다(이름 / 매개변수 / 리턴타입)

ⓑ 접근제어자를 좁은 범위로 변경할 수 없다.

ⓒ 조상클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.

– 접근 제어자 : 멤버 or 클래스에 사용되어, 외부로부터의 접근을 제한 (클래스 / 멤버변수 / 메서드 / 생성자)

private : 같은 클래스 내에서만 접근 가능

default : 같은 패키지 내에서만

protected : 같은 패키지 & 다른 패키지의 자손클래스에서 접근 가능

public : 접근 제한이 전혀 없음

– 클래스 / 추상클래스 / 인터페이스 차이

: 클래스가 설계도라면 추상클래스는 미완성 설계도이며 인터페이스는 밑그림 정도로 생각하면 된다.

클래스의 경우 속성과 기능들로 완성된 설계도이기 때문에 인스턴스를 만들 수 있지만 추상클래스와 인터페이스의 경우 미완성이기 때문에 인스턴스를 생성할 수 없다.

추상클래스는 미완성 메서드를 포함하지만 인터페이스는 선언부만 있는 메서드와 상수만을 가질 수 있으며 클래스를 작성하는데 도움을 줄 목적으로 사용된다.

인터페이스 추가 설명으로는 관계없는 클래스 간 관계를 맺어주고 표준화를 시키며 개인작업이 가능하게 해줘 프로그래밍의 시간을 단축시킬 수 있다.

( class 클래스명 / abstract class 클래스명 / interface 인터페이스명 )

* 인터페이스의 경우 상속이 가능하며 다중상속까지 가능하다.

– 컬렉션(데이터 그룹을 의미) 프레임워크 핵심 인터페이스

List : 순서 O / 중복 O (ArrayList / LinkedList / Stack / Vector 등)

Set : 순서 X / 중복 X (HashSet / TreeSet 등)

Map : (key, value)로 이루어짐. key 중복 X / value 중복 O (HashMap / TreeMap 등)

* 컬렉션과 배열의 차이 : 배열은 하나의 타입만 저장이 가능하고, 컬렉션은 다양한 타입의 저장이 가능하다. 또한 배열은 고정된 크기이며, 컬렉션은 가변적 크기이다.

– 프로세스 / 쓰레드 (프로세스 : 쓰레드 = 공장 : 일꾼)

프로세스 : 실행 중인 프로그램. 자원(resources)과 쓰레드로 구성

쓰레드 : 프로세스 내에서 실제 작업을 수행하는 단위. 모든 프로세스는 하나의 쓰레드를 가지고 있다.

멀티쓰레드 : 하나의 프로세스에 하나 이상의 쓰레드를 생성하여 실행

– 싱글톤 패턴이란?

: 애플리케이션이 시작될 때 어떤 클래스가 최초 한 번만 메모리를 할당하고(static) 그 메모리의 인스턴스를 만들어 사용하는 패턴.

(인스턴스가 필요한 경우 똑같은 인스턴스를 여러 개 만드는 것이 아니라, 동일(기존) 인스턴스를 사용하게 하는 한다)

* 장점

ⓐ 고정된 메모리 사용으로 new 인스턴스를 사용하기 때문에 메모리 낭비를 막음

ⓑ static(전역) 인스턴스이기 때문에 다른 클래스에서 데이터를 공유하기 쉬움

* 단점 : 너무 많은 사용은 다른 클래스들 간의 결합도가 높아져 수정, 테스트가 어려워질 수 있다.

손코딩 테스트 문제

728×90

개요

[김경록] [오후 2:46] greedy algorithm, dynamic programming이거는 알아야 하고

[김경록] [오후 2:46] O()의 n이 N^2면 n으로 할 수 있는지? n이면 log2n 으로 풀 수 있는 방법이 있는지 찾아보는거

[김경록] [오후 2:47] binary search가 그냥 search보다 왜 빠른지

[김경록] [오후 2:50] 최소한 이정도를 알아야 문제를 손을 대볼수가 있엉 풀수 있다는게 아님 ㅜㅜ

손코딩 테스트

언어는 java, python, nodejs 중 1개의 언어를 선택해서 풀어주세요.

풀 수 있는데까지만 풀어주시면 됩니다.

1. [7, 3, 2, 9, 4]가 들어있는 배열을 오름차순으로 정렬해서 리턴하는 함수를 만들고 주어진 배열을 정렬하세요.

.sort()사용하지 않고 직접 구현 합니다.

2.factorial로 4!를 구하는 함수를 재귀를 이용해 만들어주세요.

3.배열에 0~10억까지 숫자가 있을 때 9억 6000이 몇번째 인덱스에 있는지 알려주는 함수를 만들어주세요.

교집합 지우기

inter = list(set(lost) & set(reserve)) for i in inter: lost.remove(i) reserve.remove(i) lost_cnt -= 1

set으로 만들 후 합치면 교집합이 됨.

end.

입문용 코딩테스트 비디오

알파벳 개수 구하기 알고리즘

버블정렬 알고리즘

728×90

정보처리기사 손코딩 문제

반응형

# 정보처리기사 손코딩 문제

# C언어

## C언어 소스 코드, 홀수와 짝수를 출력하는 코드, 밑줄에 들어갈 조건문은?

#include void main() { int a = 10; if ( __________ ) printf(“짝수

“); else printf(“홀수

“); } 정답 a % 2 == 0

## C언어 소스 코드, 출력 결과

#include void main() { int a = 5; printf(“a:%d

“, a); } 정답 a:5

## C언어 소스 코드, 출력 결과

#include void main() { int a = 100; char c = ‘Z’; switch(a/10) { case 10: case 9: c=’A’; break; case 8: c=’B’; break; default: c=’F’; } printf(“%c

“, c); } 정답 A

## C언어 소스 코드, 출력 결과

#include void main() { int i, j; int temp; int a[5] = {14, 22, 53, 45, 1}; for ( i = 0; i < 4; i++ ) { for ( j = 0; j < 4-i; j++ ) { if ( a[j] > a[j+1] ) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } for ( i = 0; i < 3; i++ ) { printf("%d ", a[i]); } } 정답 1 14 22 => 버블정렬 : 인정한 두 원소 검사하여 정렬하는 것 버블정렬로 인해 for문을 돌면 앞에 값과 비교하여 큰 값이 뒤로 가지므로, a[5] = {1, 14, 22, 45, 53}; 으로 정렬된다.

## C언어 소스 코드, 출력 결과

#include void main() { int a = 0, b = 1; printf(“%d

“, a&&b); printf(“%d

“, a||b); } 정답 0 1 => C언어는 블린(Boolean)타입이 없음 (1과 0로 참, 거짓 판별) (참은 1 / 거짓은 0) && : 둘 다 1일 경우 1, 아니면 0 || : 둘 중 하나라도 1일 경우 1

## C언어 소스 코드, 출력 결과

#include void main() { int ret = 4; switch(++ret) { case 5: ret += 2; case 3: ret ++; break; case 4: ret++; default: ret*=2; } printf(“%d

“, ret); } 정답 8

## C언어 소스 코드, 출력 결과

#include int f (int i); void main() { printf(“%d %d %d”, f(1), f(5), f(-2)); } int f (int i) { if ( i <= 2 ) return 1; else return f(i-1) + f(i-2); } 정답 1 5 1 => 재귀함수 : 자기가 자기 자신을 부르는 함수 f(1) = 1 f(5) = f(4) + f(3) f(4) = f(3) + f(2) = f(2) + f(1) + 1 = 3 f(3) = f(2) + f(1) = 2 f(5) = 5 f(-2) = 1

## C언어 소스 코드, 출력 결과

#include int hrd (int n) { if ( n <= 0 ) return 1; else printf("%d ", n); hrd(n-1); } int main() { hrd(5); return 0; } 정답 5 4 3 2 1 => 재귀함수 hrd(5) = 5 hrd(4) hrd(4) = 4 hrd(3) hrd(3) = 3 hrd(2) hrd(2) = 2 hrd(1) hrd(1) = 1 hrd(0) hrd(0) = return 1; return 값이므로 출력x

## C언어 소스 코드, 출력 결과

#include int num (int a, int b) { if ( a > b ) return a; else return b; } void main() { printf(“%d

“, num(10,20) + num(30,20)); } 정답 50 => a > b : return a; a < b : return b; num(10,20) : 20 num(30,20) : 30 20 + 30 = 50 ## C언어 소스 코드, 출력 결과 #include void main() { int a = 3, b = 4; int ret = 0; ret = a > b ? a : b; switch(ret) { case 0: printf(“A”); case 4: printf(“B”); case 3: printf(“C”); case 7: printf(“D”); default: printf(“E”); } } 정답 BCDE => 삼항연산자 조건 ? 조건이 참일 때 값 : 조건이 거짓일 때 값 a > b 조건 ? 참일 떄 a : 거짓일 때 b; ret = 4; break 없으므로 case 4 부터 전체 실행

## C언어 소스 코드, 출력 결과

#include void main() { int i = 1; for ( ; i < 10 ; ) { switch (i % 2) { case 0: printf("짝수 : %d ", i); break; default: printf("홀수 : %d ", i); } i += 3; } } 정답 홀수 : 1 짝수 : 4 홀수 : 7 => default 는 if문의 else와 비슷한 역할 (위 case가 다 아닐 경우 실행, break가 없으면 default까지 실행된다.) int i = 1; 초깃값 i += 3 증감 값을 의미 i = 1 1 % 2 != 0 홀수 : 1 i = 1 + 3 = 4; i = 4 4 % 2 == 0 짝수 : 4 i = 4 + 3 = 7; i = 7 7 % 2 != 0 홀수 : 7 i = 7 + 3 = 10; 조건 i < 10에 해당하지 않음. ## C언어 소스 코드, 결과 출력 #include int main() { int a = 10; int *p = &a; printf(“%d %d

“, a, *p); a = 30; printf(“%d %d

“, a, *p); return 0; } 정답 10 10 30 30 => 포인트 int *p 는 포인터, int *p = &a 는 a의 주소 값을 갖고 있는 것. a = 10; *p = &a = 10; 10 10 a = 30; *p = 30; 30 30

## C언어 소스 코드, 결과 출력

#include int main() { int x = 7; int y = 7; int a = ++x + y–; printf(“%d

“, a); } 정답 15 => ++x : 8 ( 변수 값 증가 후 값을 사용 ) –y : 7 ( 값을 사용 후 변수 값 감소)

## C언어 소스 코드, 출력 결과

#include void main( ){ int a = 5; int s = 0; switch(a/2){ case 2 : s++; case 3 : a += s; default : a++; } printf(“%d %d”, s, a); } 정답 1 7 => a/2 = 2.5 로 2 case 2일때 s++ 로 인해서 s = 1 break가 없으므로 나머지도 실행. case 3일때 a += s 이므로 a = a + 1, a = 6 defalut a++ 이므로 a = 7 1 7

## C언어 소스 코드, 출력 결과

void main(){ int a[5] = {2, 4, 1, 3, 0}; printf(“%d %d”, a[a[4]], a[3]+a[1]); } 정답 2 7 => a[4] = 0 a[a[4]] = a[0] = 2 a[3] = 3 a[1] = 4 a[3] + a[1] = 3 + 4 = 7 2 7

# 자바

## 자바 소스 코드, 출력 결과

class Main { public static void main(String[] args) { int a = 10; int b = 20; System.out.println(++a); System.out.println(b–); } } 정답 11 20 => ++a 변수의 값을 증가 후, 변수 값 사용 b– 변수 값 사용 후, 변수의 값을 감소 a = 10; ++a = 11; 11 b = 20; 20 b– = 19;

## 자바 소스 코드, 출력 결과

class Main { public static void main(String[] args) { int x = 3; System.out.println(++x); System.out.println(x++); } } 정답 4 4 => ++x : 변수의 값을 증가 후, 변수 값 사용 x++ : 변수 값 사용 후 변수의 값을 증가 위 코드는 동일한 변수 x를 사용 x = 3; ++x = 4; 4 x = 4; 4 x++ = 5;

## 자바 소스 코드, 출력 결과 (implements)

interface ICar { // 인터페이스를 선언 void move(); // 구현체 없이 선언만 존재 } class ConCar ( ____________ ) ICar { public void move() { System.out.println(“이동합니다”); // “이동합니다”를 출력 } } class Main { public static void main(String args[]) { ICar car = new ConCar(); // 구현클래스 객체 생성 car.move(); // ConCar 클래스의 move 호출 } } 정답 implements 결과 출력 : 이동합니다. => 인터페이스를 선언한다. 구현몸체는 없이 선언만 존재한다. interface 나오면 implements

## 자바 소스 코드, 출력 결과

public class ExamSample { void func() { System.out.println(“매개변수 없음”); // “매개변수 없음”을 출력한다. } void func(int i) { System.out.println( i ); // i 값을 출력한다. } void func(int i, int j) { int k = i + j; // i와 j를 더한값을 k에 저장한다. System.out.println( k ); // k를 출력한다. } } public class Main { public static void main(String args[]) { ExamSample es = new ExamSample(); // Exam 객체를 생성한다. es.func(2, 3); // 매개변수가 2개인 메소드를 호출한다. } } ( _____ )은/는 동일 이름의 메소드를 여러개 정의할 수 있는 특성이다. 정답 오버로딩 => 오버로딩 : 메소드명 동일, 매개변수, 리턴타입은 다를 수 있다. ( 동일한 메소드를 여러개 정의할 수 있는 특성) 오버 라이딩 : 메소드명, 매개변수, 리턴타입 동일, 상속받아서 사용.

## 자바 소스 코드, 물음에 답하시오.

class A{ public void fn(){} } class B ( ① ) A{ // B는 A를 상속받음 public void fn(){} } …(생략)… (1) 위의 코드에서 ①에 들어가는 키워드는 무엇인가? (2) 위의 코드의 fn처럼 하위 클래스에서 상위 클래스 메서드를 재정의 할 수 있는 기능을 무엇이라고 하는가? 정답 (1) extends (2) 오버라이딩

# C++

## C++ 소스 코드, 출력 결과

#include void main() { int score = 95; switch(score/10) { case 10: std::cout << "수"; case 9: std::cout << "수"; case 8: std::cout << "우"; case 7: std::cout << "미"; case 6: std::cout << "양"; default: std::cout << "가"; } } 정답 수우미양가 => break가 없으므로 해당하는 케이스부터 전체 실행 95/10 = 9 (실수형 아니므로.) break 없으므로 수우미양가

## C++ 소스 코드, 출력 결과

#include void main() { int s = 0; int i; for ( i = 1; i <= 10; i++ ) { if ( i == 2 ) continue; else if ( i == 4 ) break; s += i; } std::cout << i << " " << s; } 정답 4 4 => 띄어쓰기 : (” “) 개행 : std::cout << std::endl; continue : 아래 조건 실행하지 않고 반복문으로 돌아감. i = 1; if문 x s = 1; i = 2; 2 == 2; continue; 반복문으로 돌아감 i = 3; if문 x s = 1 + 3 = 4; i = 4; 4 == 4; break; 4 4 ## C++ 소스 코드, 출력 결과 #include int fn(int n) { if ( n <= 1 ) return 1; else return n*fn(n-1); } void main() { std::cout << fn(4); } 정답 24 => 재귀함수 : 자기가 자기 자신을 부르는 함수 fn(4) = 4*fn(3) fn(3) = 3*fn(2) fn(2) = 2*fn(1) fn(1) = return 1; fn(4) = 4*3*2 = 24

## C++ 소스 코드, 출력 결과

#include using namespace std; void main() { int a[5] = {1, 2}; int s = 0; for ( int i = 2; i < 4; i++ ) { s+=a[i]; } cout << s; } 정답 0 => using namespace std; 은 컴파일러에 “std 네임스페이스의 모든 것을 사용하고 싶다”고 말하므로 컴파일러가 인식하지 못하는 이름을 찾으면 std 네임스페이스를 검사한다. 따라서 컴파일러가 “cout”(인식할 수 없는)을 발견하면 std 네임스페이스에서 찾는다 a[5] = {1, 2}; 나머지 공간 0으로 초기화 a[5] = {1, 2, 0, 0, 0} i = 2; s = 0 + a[2] = 0 + 0 = 0; i = 3; s = 0 + a[3] = 0 + 0 = 0;

## C++ 소스 코드, 출력 결과

#include using namespace std; int main() { int arr[2][2]; int count = 0; for ( int i = 0; i < 2; i++ ) { for ( int j = 0; j < 2; j++ ) { arr[i][j] = ++count; } } for ( int i = 0; i < 2; i++ ) { for ( int j = 0; j < 2; j++ ) { std::cout << arr[j][i] << " "; } } } 정답 1 3 2 4 => arr[0][0]; ++count; count = 1; arr[0][0] = 1; arr[0][1]; ++count; count = 2; arr[0][1] = 2; arr[1][0]; ++count; count = 3; arr[1][0] = 3; arr[1][1]; ++count; count = 4; arr[1][1] = 4; arr = {{1,2}, {3,4}}; std::count << arr[j][i] << " " 2중 for문 for문 i = 0 1 for문 j = 0 1 arr[0][0] = 1; arr[1][0] = 3; arr[0][1] = 2; arr[1][1] = 4; ## C++ 소스 코드, 짝수 이면서 10보다 큰 수가 입력되면 Here 출력되도록 코드 입력 #include using namespace std; int main() { int a; scanf(“%d”, &a); if ( ________________ ) printf(“Here”); } 정답 a % 2 == 0 && a > 10 => scanf 입력받는 것 scanf(“%d”, &a) 형식 지정자 %d : 정수 %f : 실수 %lf : double 실수 %c : 문자 &a 는 입력받은 값을 저장할 공간

## C++ 소스 코드, 출력 결과

#include #define ROW 3 #define COL 2 int main() { int i, j; int a[ROW][COL] = {{1, 2}, {3, 4}, {5, 6}}; int sum = 0; for ( i = 0; i < ROW; i++ ) { for ( j = 0; j < COL; j++ ) { sum += a[i][j]; } } printf("%0.2f", (float)sum/(ROW*COL)); } 정답 3.50 => #define ROW 3 : 소스 코드 내 ROW를 3으로 바꾸겠다. #define COL 2 : 소스 코드 내 COL를 2으로 바꾸겠다. %0.2f : 소수점 뒤 2자리까지 출력 a[3][2] = {{1,2}, {3,4}, {5,6}}; a[0][0] = 1; sum = 0 + 1 = 1; a[0][1] = 2; sum = 1 + 2 = 3; a[1][0] = 3; sum = 3 + 3 = 6; a[1][1] = 4; sum = 6 + 4 = 10; a[2][0] = 5; sum = 5 + 10 = 15; a[2][1] = 6; sum = 6 + 15 = 21; 21 / 3*2 = 21/6 = 3.5 %0.2f 이므로 3.50

# C++ 소스 코드, 출력 결과

#include int fn1(){ return 5; } int fn2(){ return fn1()+20; } int fn3(){ return fn1()+fn2(); } void main(){ std::cout << fn3(); } 정답 30 # C++ 소스 코드, 출력 결과 #include using namespace std; class A{ public: A( ){ cout << "A" << endl; }; A(int a){ cout << "B" << endl; }; ~A( ){ cout << "C" << endl; }; void fn( ){ cout << "D" << endl; } }; void main( ){ A a = A(5); a.fn( ); } 정답 B D C # 파이썬 ## 파이썬 소스 코드, 출력 결과 ( 자동 줄바꿈 된다. / 줄바꿈 원치 않을 경우 end=" " ) a = 5 for i in range(1, a+1): if a % i == 0: print(i) 정답 1 5 => 파이썬은 print 시 자동으로 줄바꿈이 된다. 줄바꿈을 원치 않을 경우 print(i, end=””)로 표시한다. for i in range(1, 5+1); 1 ~ 5 반복문 a = 1; 5 % 1 == 0; print(1) // 파이썬에서는 자동 줄바꿈 된다. a = 2; 5 % 2 != 0; a = 3; 5 % 3 != 0; a = 4; 5 % 4 != 0; a = 5; 5 % 5 == 0; print(5)

## 파이썬 소스 코드, 출력 결과 ( slice / 문자열[시작:끝:step] )

String = “Hello World” m = String[0:3] + String[-3:] print(m) 정답 Helrld => String[0:3] : Hel String[-3:] : rld slice를 사용한 문자열 가져오기. 문자열[시작:끝:step] (끝낼 위치를 포함하지 않는다.)

## 파이썬 소스 코드, 출력 결과 ( ** 제곱 승 )

# 2의 3승 출력 print(2**3) # 3의 2승 출력 print(3**2) 정답 8 9 => 파이썬의 기본 연산자 ** : 제곱 승 / : 몫 // : 정수 몫 % : 나머지

## 파이썬 소스 코드, 출력 결과 ( if ~ elif ~ else )

score = 60; # 60점 이상이면 “합격입니다.” 출력 아니면 “불합격 입니다.” 출력 if score >= 60: print(“합격입니다.”) else: print(“불합격입니다”) 정답 합격입니다. => 파이썬의 조건식 if 조건1: 문장1: elif 조건2: 문장2: else: 문장3:

## 파이썬 소스 코드, 출력 결과 ( a, b = b, a 변수 값 서로 swap )

a = 10 b = 5 a, b = b, a print(a) print(b) 정답 5 10 => a, b = b, a : 두 변수의 값을 서로 swap 하는 코드 a, b = b, a a = b; b = a; a = 5; b = 10;

## 파이썬 소스 코드, 출력 결과 ( slice )

>>>a=[10,20,30,40,50,60,70,80,90] >>>a[3] 40 >>>a[-5] 50 >>>a[:7:2] [10, 30, 50, 70] >>>a[:7:3] [10, 40, 70] >>>a[3:] [40, 50, 60, 70, 80, 90] >>>a[:5] [10, 20, 30, 40, 50] 정답 40 50 a[:7:2] = [10, 30, 50, 70] // 처음 ~ 7전까지, step 2 이므로 2개씩 건너뛰어서. a[:7:3] = [10, 40, 70] // 처음 ~ 7전까지, step 3 이므로 3개씩 건너뛰어서. a[3:] = [40, 50, 60, 70, 80, 90] // 3번째 ~ 끝까지 a[:5] = [10, 20, 30, 40, 50] // 처음 ~ 5전까지 => a[0]은 10 출력 a[1]은 20 출력 a[2]은 30 출력 a[3]은 40 출력 a[4]은 50 출력 a[5]은 60 출력 a[6]은 70 출력 a[7]은 80 출력 a[8]은 90 출력 a[-1]은 90출력 a[-2]은 80출력 a[-3]은 70출력 a[-4]은 60출력 a[-5]은 50출력 a[-6]은 40출력 a[-7]은 30출력 a[-8]은 20출력 a[-9]은 10출력 a[:7:2]는 처음 값인 10 부터 7번째인 70까지 2개씩 건너뛰어서 출력 a[:7:3]는 처음 값인 10 부터 7번째인 70까지 3개씩 건너뛰어서 출력 a[3:]은 40부터 끝까지 출력 a[:5]은 처음부터 5번째 까지 출력

## 파이썬 소스 코드, 출력 결과

>>> i=1 >>> a=4 >>> while i <= 9: ... print(a, '*', i, '=', a*i) ... i = i + 1 ... 4 * 1 = 4 4 * 2 = 8 4 * 3 = 12 4 * 4 = 16 4 * 5 = 20 4 * 6 = 24 4 * 7 = 28 4 * 8 = 32 4 * 9 = 36 >>>print( i ) 정답 10 => 반복문이 i가 9일때 종료되지만, 4 * 9 = 36 출력 후 i = i + 1 로 값이 증가되며 종료.

## 파이썬 소스 코드, 출력 결과

>>> sum=0 >>> a=[1,2,3,4,5] >>> for i in range(0,5): … sum += a[i] >>> print(sum) 정답 15 => for i in reange(0, 5)로 i 가 0 ~ 4까지 반복 i = 0 a[0] = 1 i = 1 a[1] = 2 i = 2 a[2] = 3 a = 3 a[3] = 4 a = 4 a[4] = 5 이므로.. sum에 누적해서 더한 값 = 1 + 2 + 3 + 4 + 5 = 15

## 파이썬 소스 코드, 생성자 및 소멸자 입력

class A: def (1)(self): print(“생성자”) def (2)(self): print(“소멸자”) a = A() del a 정답 (1) : __init__ (2) : __del__ => 파이썬의 생성자 class 클래스명: def __init__(self) 명령어; 파이썬의 소멸자 class 클래스명: def __del__(self) 명령어;

# SQL 쿼리 문제

## 학생 테이블, ‘이’씨 성을 가진 사람의 학번을 출력

학번 이름 2001 안창호 2002 김정호 2003 김유신 2004 허준 2005 이성계 2006 이순신

결과

학번 2005 2006

SELECT 학번 FORM 학생 WHERE 이름 LIKE ‘이%’; * LIKE 검색방법 ‘이’로 시작 : ‘이%’ ‘이’로 끝 : ‘%이’ ‘이’가 들어간 사람 : ‘%이%’ ‘이’로 시작, ‘이’ 뒤에 1글자만 있는 사람 : ‘이_’ // 밑줄 1개 ‘이’로 시작, ‘이’ 뒤에 2글자만 있는 사람 : ‘이__’ // 밑줄 2개 ‘이*신” 검색 : ‘이_신’

## 성적 테이블 IN 키워드 사용, ‘컴퓨터 구조’와 ‘알고리즘’ 과목에 대한 학번별 평균 학점 구하는 쿼리

학번 과목 학점 2001 컴퓨터구조 4.5 2001 운영체제 4.0 2002 알고리즘 4.5 2003 컴퓨터구조 3.5 2003 알고리즘 2.5

결과

학번 평균 2001 4.5 2002 4.5 2003 3.0

SELECT 학번, AVG(학점) as 평균 FROM 성적 WHERE 과목 IN(‘컴퓨터구조’, ‘알고리즘’) GROUP BY 학번;

## 성적 테이블 ‘컴퓨터구조’ 과목을 수강한 사람의 학번과 학점을 학점순(오름차순)으로 정렬

학번 과목 학점 2001 컴퓨터구조 4.5 2001 운영체제 4.0 2002 알고리즘 4.5 2003 컴퓨터구조 3.5 2003 알고리즘 2.5

SELECT 학번, 학점 FROM 성적 WHERE 과목=”컴퓨터 구조” ORDER BY 학점 ASC; DESC : 내림차순 ASC : 오름차순

## 성적 테이블에서 과목만 출력하는 쿼리 ( 단, 과목 중복 x )

학번 과목 학점 2001 컴퓨터구조 4.5 2001 운영체제 4.0 2002 알고리즘 4.5 2003 컴퓨터구조 3.5 2003 알고리즘 2.5

SELECT DISTINCT 과목 FROM 성적;

## 고객 테이블에서 나이가 50살 이상이면서 59살 이하이고, 성별이 남자인 사람의 이름을 출력하는 쿼리를 작성하시오.(단, BETWEEN 구문을 사용해야 한다.)

이름 나이 성별 주소 홍길동 20 남 경기도 임꺽정 59 남 전라도 유관순 35 여 경상도 나혜석 41 여 충청도 이순신 33 남 강원도

SELECT 이름 FROM 고객 WHERE 나이 BETWEEN 50 AND 59 AND 성별=’남’;

## 성적 테이블, SQL 실행결과 작성

SELECT SUM(성적) FROM 성적 a, 학생 b WHERE a.학번 = b.학번 AND a.학년=’1′;

학번 이름 학년 20170001 강은미 4 20180002 김정미 3 20190003 홍길동 2 20200004 장길산 1 20200005 김철희 1

학번 과목 점수 20190003 영어 90 20200004 영어 80 20200005 영어 90

정답 170 => 20200004, 2020005의 점수 합계가 조회된다. 90 + 80 = 170

## 학생 테이블, SQL 실행 결과 작성

학번 이름 점수 2001 안창호 90 2002 김정호 85 2003 김유신 75 2004 허준 80 2005 이성계 95

제시된 SQL 쿼리 select count(이름) from ( select 이름 from 학생 where 성적 >= 80 and 성적 <= 90 union select 이름 from 학생 where 성적 >= 75 and 성적 <= 80 ); count(이름) 4 => union : 두 SQL 문장을 중복을 제거한 합집합을 출력

## 학생 테이블, INDEX 생성, 삭제 문제

학생 테이블의 학번 속성을 이용 인덱스를 생성하고, 인덱스를 삭제하는 SQL문 작성

학번 이름 점수 2001 안창호 90 2002 김정호 85 2003 김유신 75 2004 허준 80 2005 이성계 95

CREATE INDEX INDEX_STUDENT ON 학생(학번); DROP INDEX INDEX_STUDENT ON 학생; => 1. 인덱스 작성하기 CREATE INDEX 인덱스명 ON 테이블명 (열명1, 열명2, …); 2. 인덱스 삭제하기 DROP INDEX 인덱스명 ON 테이블명;

## 학생 테이블, 가장 높은 성적 출력하는 쿼리 작성

학번 이름 점수 2001 안창호 90 2002 김정호 85 2003 김유신 75 2004 허준 80 2005 이성계 95

학번 성적 2005 95

SELECT 학번, max(성적) as 성적 from 학생

## 성적 테이블, SQL 쿼리 실행 결과

학번 과목 성적 1000 보안 A 1001 운영체제 B 1002 통계 A+ 1003 암호학 B+ 1005 알고리즘 A 1006 보안 A+

select 과목 from ( select 과목, count(과목) from 성적 group by 과목 having count(과목) > 1 ) a;

과목 ( 1 )

정답 (1) : 보안

# 계층 구조 문제

## 깊이 우선, 너비 우선 순서 작성하는 문제

시스템을 구성하는 모듈들의 계층 구조에서 가장 상위에 있는 모듈부터 시작하여 하위에 있는 모듈들을 점진적으로 통합하는 하향식 통합 테스트 방식에 대한 그림이다. 깊이 우선 방식과 너비 우선 방식으로 통합 테스트를 수행할 때 올바른 순서를 쓰시오.

깊이 우선 방식 : M1, M2, M3, M4, M5, M6, M7, M8 너비 우선 방식 : M1, M2, M4, M8, M3, M5, M6, M7

출처 : 수제비 정보처리기사 cafe.naver.com/soojebi?iframe_url=/MyCafeIntro.nhn%3Fclubid=29835300

반응형

문과생인 내가 개발자가 되기까지 #5 (마지막)

# 글 목록

– 문과생인 내가 개발자가 되기까지 #1 (회사 퇴사 이야기)

– 문과생인 내가 개발자가 되기까지 #2 (학원 등록)

– 문과생인 내가 개발자가 되기까지 #3 (구직 1)

– 문과생인 내가 개발자가 되기까지 #4 (구직 2)

– 문과생인 내가 개발자가 되기까지 #5 (마지막)

코딩테스트

내가 경험한 코딩테스트는 총 세 가지였다. 가장 흔한 방식은 안드로이드 프로젝트를 요구사항에 맞게 만들어 소스코드를 제출하거나 깃허브에 올리는 형태였고, 또 하나는 오프라인 혹은 온라인으로 알고리즘 문제를 푸는 형태, 그리고 마지막은 손코딩이었다. 나는 프로젝트 제출형을 선호했다. 내가 제출한 코드가 대체적으로 결과가 좋았기 때문이다. 그래서 조금씩 자신감이 생겼다. 다만 프로젝트 제출형은 시간과 노력이 많이 들어가는 점이 단점이다. 그런 단점에도 불구하고 비전공자인 내가 좋은 인상을 줄 수 있는 가장 좋은 방법은 소스코드를 보여주는 것이라고 생각했다.

두 번째는 알고리즘 테스트다. 알고리즘 테스트는 두어번 봤지만 자료구조를 제대로 공부하질 않아서 어설프게 풀 수 밖에 없었다. 자료구조에 대한 지식이 전무하다시피 하던 당시 나는 Stack이나 Queue를 사용해본 적도 없었다. 그래서 모든 문제를 반복문, if문, 리스트를 사용해서 풀려고 했다. 당연히 결과가 좋을 수 없었다. 그래서 알고리즘 시험을 대비해 조금씩 자료구조를 공부하고 알고리즘 문제도 풀기시작했다.

마지막은 흔히 손코딩이라고 하는 방식이다. 필기도구를 이용해 종이에 코드를 적으면서 문제를 풀어나가는 방식이다. 손코딩은 딱 한 번 경험했다. 경험이 없어서 상당히 긴장을 많이했다. 영어로 된 지문이 출력물로 주어졌고 연결리스트(LinkedList)의 함수를 구현하는 것이 문제였다. 1시간 넘게 문제를 풀었지만 모든 문제를 풀지는 못했다. A4용지 앞뒤면을 꽉채우고 새 종이의 한 면을 더 사용했던 것 같다. 면접관에게 내가 작성한 코드를 제출하고 물어보시는 여러 질문들에 아는 만큼 대답했다. 예를 들어 연결리스트에서 아이템을 삭제하는 remove()함수는 어떻게 구현하면 되겠냐는 질문에서 나는 아이템 양쪽의 연결을 끊고 null 처리를 한 다음 끊어진 양쪽을 서로 이으면 된다고 대답했는데, 면접관은 null처리를 할 필요가 없다고 하셨다. 왜냐하면 참조를 받지 않으면 가비지 컬렉터에 의해 알아서 지워질 거라는 것이었다. 이런식으로 내가 푼 문제에 대한 여러 질문이 오고 가며 추가 설명을 덧붙여주셨다.

면접

첫 회사의 실패를 거름삼아 그 뒤로는 기술면접에 나올만한 것들을 위주로 공부하며 정리하기 시작했다. 구직 중에도 오히려 공부할 것이 너무 많았다. 기술면접 준비도 해야했고 코딩테스트 과제도 계속 해야했다. 그렇다 보니 충분히 준비된 상태에서 면접에 갈 수 없었다. 그래서 면접에 다녀오면 항상 나왔던 질문들을 모두 정리해서 기록했고, 다른 곳에서도 물어볼 법한 질문들은 특별히 자세히 공부하고 OneNote 정리했다. 이런 방식이 상당히 도움이 많이 되었다. 그리고 다른 사람들이 블로그에 정리해둔 면접 질문들도 많이 참고했다. 이때 정리한 글들은 나중에 이직 때에도 찾아보게 되었고, 그 때도 마찬가지로 이런 방식으로 정리해서 기록으로 남겨두었다.

기술면접에서도 자료구조에 대한 질문이 나오는 경우가 있지만 나는 안드로이드 개발자로 지원했기 때문에 대체적으로는 안드로이드 관련 질문이 많았다. 그리고 간혹 네트워크나 객체지향 프로그래밍에 대한 질문도 나오기도 했고 이 밖에는 Java나 Kotlin 언어와 관련된 질문들도 꽤 자주 나왔다. 최대한 아는 것을 자세하게 설명하려고 했다. 알고 있는 것이라도 예상하지 못한 질문은 답할 때 횡설수설하게 될 수 있다. 그래서 면접에 나올만한 것들을 정리할 때 실제로 말을 해보는게 좋은 것 같다. 그리고 모르는 것은 민망해도 모른다고 답했다.

그 외에 항상 받는 질문은 왜 개발자로 직업을 바꾸고 싶은가에 대한 것이었다. 이전 회사들에서 어떤 일들을 경험했는지, 어떤 이유로 개발자라는 직업을 선택하게 되었는지를 의외로 자세히 묻는 분들이 많았다. 그 때마다 나의 이야기를 솔직하면서도 차분하게 나누었다. 대부분은 내 이야기를 들으시며 수긍하시는 듯 했고, 더러는 상당히 흥미로워하시는 분들도 있었다. 개발자 경력만 놓고 봤을 때는 이력서에 보이는 내 경력이 그렇게 매력적일 것이라고 생각하지는 않는다. 그러나 나에게는 내가 살아온 길이 자랑스럽고 소중하다. 그래서 매번 같은 질문을 받을 때마다 그런 내 마음을 담아 이야기를 할 수 있었다. 나중에는 하도 많이 말해서 술술 이야기하게 되었지만 그래도 항상 진솔함을 담아 이야기하려고 노력했다.

나는 원래 긴장을 잘 하는 편이다. 특히 면접 경험이 많지 않기 때문에 면접 때 긴장을 많이 할까봐 걱정이 되었다. 그래서 이 문제로 하나님께 기도하고 도움을 구했다. 그러자 내가 갈 회사가 분명히 있다는 생각이 들었다. 마음이 차분히 가라앉고 걱정이 사라졌다. 다만 나는 모든 과정에 최선을 다하면 될 뿐이었다. 면접 장소에서 사람들을 만나면 말투와 표정 그리고 행동거지에도 항상 신경을 썼다. 항상 면접 30분 정도 전에 도착해서 회사 주변을 걸으며 이 회사들이 좋은 회사로 성장하도록 그리고 그날의 만남을 하나님이 축복해주시도록 기도했다. 그 결과 모든 면접에서 크게 긴장하지 않고 침착하게 이야기를 나눌 수 있었다. 그리고 신기하게도 면접에 가는 일이 점점 재미있어졌다. 많은 회사를 직접 가서 보고 사람들과 이야기를 나누는 모든 과정이 흥미진진했다. 결과가 좋지 않아도 크게 실망하지 않았다. 면접 자체만으로도 배우는 것이 많았다.

도시 속을 걸으며 내게 기회가 주어졌음에 감사했다.

첫 연봉 협상

구직기간은 약 2개월 정도 되었다. 첫 면접 후에 이대로는 안되겠다 싶어서 3주 정도를 더 공부하는데 사용했다. 처음에는 어떤 회사에서 연락이 올까, 내 이력서가 어떻게 보일까, 정말 취업할 수 있을까. 이런 걱정들이 정말 많았다. 그러나 결과적으로는 감사하게도 여러 회사들의 연락을 받았다. 많은 회사들이 내 이력서를 좋게 봐주고, 내 코드를 좋게 평가해주었다. 처음으로 한 회사에서 함께하고 싶다는 연락을 받았을 때 날아갈 듯이 기뻤다. 나도 그 회사의 면접 경험이 너무나 좋았고, 그들과 함께 일한다면 즐거울 것 같았다. 그리고 곧 그들이 제시하는 연봉액이 전달되었다. 그러나 내가 제시한 희망연봉에 미치지 않았다. 고민이 많아졌다. 고민을 마치는 데 하루 정도 걸렸다. 결론은 내가 정해둔 연봉의 하한선을 수정하지 않기로 했다. 큰 맘을 먹고 개발자가 되기로 결정한 이상 연봉의 문제에서 만큼은 더욱 기준을 세우고 스스로 타협하지 않기로 했다. 나의 의사를 회사에 전했고 서로의 길을 응원하며 만남을 마무리했다. 이 일 이후로 나는 더욱 확신이 생겼다. 구직이 좀 더 길어지더라도 연봉을 낮추지는 않겠다고 마음 먹었다. 그렇기 때문에 나는 더욱 집중해서 부족한 부분을 보완하고 준비해야만 했다.

입사를 결정한 회사

2019년 5월에 아내와 중국 상하이를 여행중이었다. 그곳에서 이메일을 하나 받았는데, 로켓펀치를 통해 지원한 회사중 한 곳에서 면접을 하고 싶다는 내용이었다. 이 회사는 위에 적은 회사 중 유일하게 손코딩 테스트를 한 회사였다. 이메일을 주고 받는데 어투가 싸늘해서 신경이 쓰였다. 한국으로 돌아와 틈틈히 손코딩에 대한 사람들의 후기를 찾아보았다. 어려울 것 같았다.

당일에 회사를 찾아가보니 신기하게도 내게 메일을 쓰신 분은 메일과는 달리 상당히 친절하셨다. 그분은 이제 막 설립된지 1년된 스타트업의 CTO였다. 손코딩 테스트는 그야말로 쥐어짜내듯이 문제를 풀었다. 풀면서도 ‘이건 망했다’는 생각이 많이 들었다. 그리고 제출했는데 의외로 전공자들도 백지를 많이 냈다면서 수고했다고 말씀하셨다. 그리고 이후에 여러 기술적 이야기를 나누면서 이 사람과 함께 일하고 싶다는 생각을 많이 했다. 회사는 비록 작고 불안정하겠지만 내 성장을 위해서라면 더없이 좋겠다는 생각이 들었다.

그리고 약 일주일 뒤에 합격소식을 받았다. 처후에 대한 협의를 하고싶으니 다시 방문해달라는 연락을 받았다. 다소 긴장이 되었다. 약속 당일 회사로 갔을 때 다른 이사님 세 분을 더 만났다. 아직 처우협의가 끝나지 않았는데 마치 입사하기로 된 것 처럼 이야기가 흘러갔다. 좋은 분위기였다. 그리고 다시 CTO와 둘이 회의실에 남아 처우 협의를 했다. 연봉은 내가 정한 하한선에 맞춰졌다. 물론 더 올리고 싶었지만 아직은 그런 협상에 익숙하지 않았다. 식사비는 회사에서 지원해주고, 일주일에 한 번 재택근무를 할 수 있는 조건이었다. 개발장비는 내가 원하는 것으로 구매해주신다고 했지만 맥북을 추천하셔서 맥북프로를 사용하게 되었다. 모두 만족스러웠고 이 사실이 믿기지 않았다. 드디어 내가 개발자가 된 것이다.

첫 회사에서 내가 사용한 자리

이 때가 작년 2019년 5월이다. 꽤 오래전 이야기처럼 느껴진다. 2017년 말에 무역회사를 퇴사하고 개발자가 되기로 마음먹었으니 구직까지 1년 반 정도가 걸렸다. 드디어 개발자로 일을 시작하게 된 것이다. 그 뒤에 많은 일들이 일어났다. 회사에도 많은 우여곡절이 있었지만 그 사이 나도 많이 성장할 수 있었다. 면접관으로 들어오신 그 CTO는 개인적 사정으로 몇 개월 뒤 회사를 떠나다시피 했다. 그리고 내가 퇴사하기 전까지 나는 회사의 유일한 개발자로 일했다. 부족한 실력으로 회사에 누를 끼치지 않기 위해 최선을 다했지만, 한 편으로는 내 실력을 더 키우고 성장해야 한다는 고민이 갈수록 진지해졌다. 올해 다시 이직을 하여 지금의 회사로 왔다. 그 때의 시간들이 소중하고 감사한 기억으로 남아있다.

사람의 길이라는 것이 앞으로 어떻게 나아갈지 알 수 없다. 나도 내가 개발자가 되리라고는 불과 3년 전까지 꿈에도 생각해보지 못했다. 공부하는 동안 결혼을 했고, 지금 아내의 뱃속에서는 아이가 자라고 있다. 1년 뒤에 내 삶이 어떤 모습일지 상상이 안된다. 다만 매일 하루하루 성실히 살고 성장하길 원한다. 인생에서 예측할 수 없는 많은 일들이 사람의 삶을 더욱 다채롭고 풍요롭게 만들어주는 것 같다. 삶이 예측가능하다면 무슨 재미가 있을까. 앞으로 더욱 파란만장할 내 삶에 응원을 보낸다.

손코딩 면접 준비

반응형

재귀를 이용한 피보나치

메모이제이션을 이용한 피보나치

재귀를 이용한 팩토리얼 문제

10회 1~10까지 랜덤한 숫자를 출력하여 중복된 숫자가 있을 경우 true, false를 반환

1000보다 작은 숫자 중 3과 5의 배수의 총합을 구하는 프로그램

주어진 정수배열에서 0을 가장 왼쪽으로 배치하는 함수 (추가 메모리공간 X, in-place)

배열을 오름차순으로 정렬해서 리턴하는 함수

임의의 string이 주어질 때 reverse

큐로 스택 구현하기

스택으로 큐 구현하기

최대 공약수와 최소 공배수를 구하는 알고리즘

n개의 배열에서 k(k<=n) 번째로 큰수를 찾는 효과적인 방법 재귀를 이용한 피보나치 int fibo(int n) { if(n == 0) return 0; else if(n == 1) return 1; else return fibo(n - 1) + fibo(n - 2); } n이 int형이기 때문에 n<40인 피보나치까지 구할 수 있던 것으로 기억한다. 메모이제이션을 이용한 피보나치 int fibo(int n) { if(n == 0) return 0; else if(n == 1) return 1; else if(fibo[n] != 0) return fibo[n]; else return fibo[n] = fibo(n - 1) + fibo(n - 2); } 재귀를 이용한 팩토리얼 문제 int factorial(int n) { if(n == 1) return 1; else return n * factorial(n - 1); } 10회 1~10까지 랜덤한 숫자를 출력하여 중복된 숫자가 있을 경우 true, false를 반환 int randomQuiz() { for(int i = 0; i<10; i++) { int n = rand() % 10 + 1; cout << n << endl; if(!Quiz[n]) { cout << "false" << endl; Quiz[n] = true; } else cout << "true" << endl; } } 1000보다 작은 숫자 중 3과 5의 배수의 총합을 구하는 프로그램 int sum() { int res = 0; for(int i = 1; i<1000; i++) { if(i % 3 == 0 || i % 5 == 0) res += i; } return res; } 정렬 주어진 정수배열에서 0을 가장 왼쪽으로 배치하는 함수 (추가 메모리공간 X, in-place) 배열을 오름차순으로 정렬해서 리턴하는 함수 제자리 정렬 중 어느 것이던 오름차순으로 구현 (삽입, 버블, 퀵, 선택 정렬) 버블정렬 void bubbleSort(int n, int *arr) { for(int i = 0; i < n; i++) for(int j = i + 1; j < n; j++) if(arr[i] > arr[j]) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }

임의의 string이 주어질 때 reverse

void stringReverse(int length, string str) { for(int i = 0; i < length / 2; i++) { char temp = str[i]; str[i] = str[length - 1 - i]; str[length - 1 - i] = temp; } } 큐로 스택 구현하기 class Stack { queue a, b; void push (int n) { if(a.empty()) a.push(n); else { while(!a.empty()) { b.push(a.front()); a.pop(); } a.push(n); while(!b.empty()) { a.push(b.front()); b.pop(); } } } int pop() { int front = a.front(); a.pop(); return front; } }

스택으로 큐 구현하기

class Queue { stack a, b; void push (int n) { a.push(n); } int pop() { if(b.empty()) while(!a.empty()) { b.push(a.top()); a.pop(); } int top = b.top(); b.pop(); return top; } }

최대 공약수와 최소 공배수를 구하는 알고리즘

int gcd(int a, int b) { if(b == 0) return a; return gcd(b, a % b); } int lcm(int a, int b) { return a * b / gcd(a, b); }

n개의 배열에서 k(k<=n) 번째로 큰수를 찾는 효과적인 방법 hochulshin.com/algorithm-find-kth-item/ 반응형

저의회사에서 신입을 뽑기로 했습니다….

저의 회사는 스프링을 주로 쓰는데 제 후임을 받는 것이니 저한테 위임을 하더라구요…. 너무 부담스럽습니다… ㅜㅜ

그런데 코딩테스트를 하라고 하시는데…. 스프링 프로젝트를 만들라고하는건 좀 그런가 싶기도하고

어떤 방향으로 해야할지 모르겠습니다… 그냥 1에서 100까지 홀수 합을 구하라는건 너무쉽고.. 난이도를 잘 모르겠네요… 저같이 핫바지에게 맡기는건 너무하다고 생각하지만…취지는 좋다만 걱정입니다.

조언 부탁드릴께요

손코딩, 라이브코딩테스트(라이브코테) 면접 관련 대비

[손코딩, 라이브코테 면접 관련 대비]

질문중에 면접 때 라이브코테, 손코딩은 어떻게 준비하냐고 물어보셔서 답변드립니다.

손코딩, 라이브코테는 예로 자료구조는 퀵정렬, 삽입정렬 등 정렬이 나오는 편입니다.

또한 알고리즘은

스택 두개주고 큐만들기, 소수문제, 길찾기 문제, 숫자중에 0이나, 7의 개수, 팩토리얼 수중에 0인것, 피보나치, 완전탐색 기초적인것(DFS, BFS), 달팽이문제, 배열돌리기, 해쉬맵으로 카운트해서 정렬하기 , 이진검색트리, 타켓숫자을 주고 배열중 두수로 타켓숫자 만들기 등 문제가 나오는편이며,시간복잡도를 높게짜면, 줄이는 방식으로 물어봅니다. 다시짜면됩니다.

로직설명은 알고리즘 스터디때 하는 설명 방식으로 면접관님께 차분히 설명해주시면됩니다.

문제를 모르는 경우는 면접관에게 질문해주시면됩니다. 또한 힌트도 주실겁니다.

이런식으로 쉬운문제부터 손으로 푸는연습, 로직 말하는 연습 준비하시면 깔끔히 보실겁니다.

^^리트코드 기준으로 이지문제 손코딩으로 연습하시면 좋을것같아요.

추가적으로 언어는 크게 상관없었습니다.

요즘 면접때 화면공유로 코딩(ide)을 하는편이며 손코딩에 대해서 익숙해집시자.

개발자 면접 시 손코딩 테스트란?

반응형

개발자 자체서비스 면접 시

간간히 손코딩을 하라고 하는 경우가 있던데

지금 떠올려보면 이게 제일 힘들었던 것 같다

먼저 손코딩이란

보드마카 하나 주고 보드에

특정 알고리즘을 구현해보라고

하는 내용이 대부분인데

(혹은 구현해야 할 내용을 알려주고

그거를 쓰게 하는 식의..)

문제의 난이도보다는

여러명이서 뚫어져라 쳐다보고 있는데

갑자기 쓸라니까 생각도 잘 안나고

손으로 쓰면 자동완성도 지원 안되고

실제 로직이 맞는건지 아닌건지

검증도 안되기 때문에

어버버 이러다가 제대로 설명도 못하고

대량실점으로 이어지는데

내 경험상으로는

실제 내가 적은 코드의 완성도보다는

왜 그렇게 했는지

논리를 보는 경우가 대부분이던데

코드를 100% 정확하게 짜는게 중요한게 아니라

굴러가는 로직만 잘 설명해주면 되기 때문에

실제 이게 돌아가는지 아닌지에 대해서는

큰 신경을 쓸 필요가 없어 보인다

애초에 손으로 쓰는 것이기 때문에

놓치는 부분이 엄청나게 많은데

쓴 걸 가지고 면접관에게 설명을 할 때

알아들을 수 있게 설명하면 되는거지

실제로 그 코드를 넣어서 에러가 나건 말건

이런 걸 보는게 아니더라

나도 면접 중에 보면

말로는 굴러가는 걸 어떻게든 설명을 하는데

머리가 핑핑 돌기 때문에

손으로 쓴 코드는

말보다 많이 못한 경우가 많았는데

다행히 손으로 쓴게 개판이라고 해도

논리만 쭉 듣고 얘기를 나누는 경우가 대부분이었고

이거 안돌아갈 텐데요…

이러는 경우는 한번도 없었다

그나마 내가 할 줄 아는 알고리즘을 물어보면

코드는 개발쇠발로 짜도 말로만 잘 설명해서

퉁치면 되긴 하는데

나도 잘 모르는데 그걸 코드로 짜라고 하면

진짜 모르는데 이걸 어떻게 쓰라는 건지

펜 들고 있자니 떠오르는 것도 없고

3명이서 뒤통수만 쳐다보는데

아 이런 젠장…

시간이 급한데 뒤에서 뚫어져라 쳐다보기 때문에

알고 있던 내용도 빠르게 기억에서 사라지는데

이게 면접 중에서는 가장 힘들었던 것 같다

반응형

키워드에 대한 정보 손 코딩 문제

다음은 Bing에서 손 코딩 문제 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 코딩테스트 효율적으로 준비하는 방법 | 손코딩 고민시간

  • 동영상
  • 공유
  • 카메라폰
  • 동영상폰
  • 무료
  • 올리기

코딩테스트 #효율적으로 #준비하는 #방법 #| #손코딩 #고민시간


YouTube에서 손 코딩 문제 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 코딩테스트 효율적으로 준비하는 방법 | 손코딩 고민시간 | 손 코딩 문제, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  저혈압 에 좋은 차 | 기립성 저혈압에 좋은 음식, 식습관 8가지 뉴욕 심장센터에서 제시한 방법 알려드립니다. 인기 답변 업데이트

Leave a Comment