상세 컨텐츠

본문 제목

프로그래머 도전기 37일차

프로그래머가 될거야!

by Choyee 2023. 10. 5. 23:35

본문

오늘은

오늘은 학원에서 연달아 테스트를 두개를 보았습니다

그래서 수업을 거의 하지 못했는데요

성적이 꽤나 잘 나와서 다행이라고 생각합니다

Java에 대해서는 학원 수업으로 온전히 하고있고

이후에 혼자 JavaScript를 공부하고 틈틈이 코딩 테스트를 풀고있기 때문에

Java 공부가 조금 부족하지 않았나 걱정 했지만 

나름 잘 따라가고 있었던 듯 합니다

하지만 따라가는것에 만족을 하면 안되겠지요...

더욱 열심히 해보도록 하겠습니다

 

Java 강의
package test;

import java.util.Arrays;

import java.util.Scanner;

public class TestController {

	public void test1() {
		Scanner sc = new Scanner(System.in);
		String[] personArr = new String[5];

		for(int i = 0; i < personArr.length; i++) {
			System.out.print((i+1) + "번째 주민번호 입력 : ");
			String personId = sc.nextLine();
			
			if((personId.length() == 14)) {
				char gender = personId.charAt(7);
				char hyphen = personId.charAt(6);
				if(gender == '1' || gender == '2' || gender == '3' || gender == '4' && hyphen == '-') {
					personArr[i] = personId.substring(0, 8) + "******";
				} else {
					System.out.println("잘못된 주민번호 형식입니다. 다시입력하세요.");
					i--;
				}
			} else {
				System.out.println("잘못된 주민번호 형식입니다. 다시입력하세요.");
				i--;
			}
		}
		System.out.println("--- 주민번호 정보 등록 완료 ---");
		System.out.println(Arrays.toString(personArr));
	}
}
package test;

public class TestRun {

	public static void main(String[] args) {
		TestController tc = new TestController();
		tc.test1();

	}
}
Console
1번째 주민번호 입력 : 910310 - 2012321
잘못된 주민번호 형식입니다. 다시입력하세요.
1번째 주민번호 입력 : 910310-2012321
2번째 주민번호 입력 : 940221-1023922
3번째 주민번호 입력 : 9510231230012
잘못된 주민번호 형식입니다. 다시입력하세요.
3번째 주민번호 입력 : 951023-1230012
4번째 주민번호 입력 : 981220-2031202
5번째 주민번호 입력 : 032102-4021230
--- 주민번호 정보 등록 완료 ---
[910310-2******, 940221-1******, 951023-1******, 981220-2******, 032102-4******]

String 메서드를 이용한 주민번호 등록 프로그램입니다

중간중간 오류를 수정해서 프로그램이 정상적으로 작동할 수 있도록 코드를 수정해주고

예외를 처리해야하는 테스트였습니다

 

 

package kr.or.iei.run;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {

	private static ServerSocket serverSocket;
	public static void main(String[] args) {

		System.out.println("====================================================");
		System.out.println("서버를 종료하려면 q 또는 Q를 입력하고 Enter를 누르세요.");
		System.out.println("====================================================");

		//TCP 서버 시작
		startServer();
		Scanner scanner = new Scanner(System.in);
		while(true) {
			String key = scanner.nextLine();
			if(key.toLowerCase().equals("q")) {
				break;
			}
		}
		scanner.close();
		stopServer();
	}

	public static void startServer() {
		//작업 스레드 정의
		Thread thread = new Thread() {
			@Override
			public void run() {
				//ServerSocket 생성 및 Port 바인딩
				try {
					serverSocket = new ServerSocket(7777);
					System.out.println("[서버] 시작됨");
					
					while(true) {
						System.out.println("\n[서버] 연결 요청을 기다림\n");
						Socket socket = serverSocket.accept();
						InetSocketAddress isa = (InetSocketAddress)socket.getRemoteSocketAddress();
						String clientIp = isa.getHostString();
						System.out.println("[서버] " + clientIp + "의 연결 요청을 수락함");
						
						//데이터 받기
						InputStream is = socket.getInputStream();
						DataInputStream dis = new DataInputStream(is);
						String message = dis.readUTF();
						//System.out.println("[서버] 데이터를 받음: " + message);
						
						//데이터 보내기
						OutputStream os = socket.getOutputStream();
						DataOutputStream dos = new DataOutputStream(os);
						dos.writeUTF(message);
						dos.flush();
						System.out.println("[서버] 받은 데이터를 다시 보냄: " + message);
						socket.close();
						System.out.println("[서버] " + clientIp + "의 연결을 끊음");
					}
				} catch (IOException e) {
					System.out.println("[서버] " + e.toString());
				}
			}
		};
		thread.start();
	}
	public static void stopServer() {
		try {
			serverSocket.close(); 
		} catch (IOException e) {
			e.printStackTrace();

		}
	}
}
package kr.or.iei.run;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {

	public static void main(String[] args) {

		try {
			Socket socket = new Socket("127.0.0.1", 7777);
			System.out.println("[클라이언트] 연결 성공");

			//데이터 보내기
			String sendMessage = "오늘도 좋은 하루 되세요!";
			OutputStream os = socket.getOutputStream();
			DataOutputStream dos = new DataOutputStream(os);
			dos.writeUTF(sendMessage);
			dos.flush();
			System.out.println("[클라이언트] 데이터를 보냄: " + sendMessage);

			//데이터 받기
			InputStream is = socket.getInputStream();
			DataInputStream dis = new DataInputStream(is);
			String receiveMessage = dis.readUTF();
			System.out.println("[클라이언트] 데이터를 받음: " + receiveMessage);
			socket.close();
			System.out.println("[클라이언트] 연결 끊음");

		} catch (UnknownHostException e) {
			System.out.println(e.toString());

		} catch (IOException e) {
			System.out.println(e.toString());

		}
	}
}
====================================================
서버를 종료하려면 q 또는 Q를 입력하고 Enter를 누르세요====================================================
[서버] 시작됨
[서버] 연결 요청을 기다림
[서버] 127.0.0.1의 연결 요청을 수락함
[서버] 받은 데이터를 다시 보냄: 오늘도 좋은 하루 되세요!
[서버] 127.0.0.1의 연결을 끊음[서버] 연결 요청을 기다림
q
[서버] java.net.SocketException: Socket closed
[클라이언트] 연결 성공
[클라이언트] 데이터를 보냄: 오늘도 좋은 하루 되세요!
[클라이언트] 데이터를 받음: 오늘도 좋은 하루 되세요!
[클라이언트] 연결 끊음

TCP 서버를 이용한 데이터를 주고받는 프로그램입니다

마찬가지로 오류나는 부분을 찾아서 고치고 예외를 처리해주어야 하는 테스트였습니다

 

JavaScript 공부

<화살표함수, this키워드>

this키워드를 사용하면 일반함수를 사용했을 때와 화살표 함수를 사용했을 때가 다르게 동작한다

const person = {
      firstName : 'viggo',
      lastName : 'Mortensen',   // 사람이라는 상수와 특성 두개 = 객체
      fullName : function( ) {   // 풀네임 메서드
             return `${this.firstName} ${this.lastName}`
}
=> 이름 출력
=> this키워드가 함수 왼쪽에 있는 객체를 가리킨다 = 사람이라는 객체를 가리킨다
const person = {
      firstName : 'viggo',
      lastName : 'Mortensen',   // 사람이라는 상수와 특성 두개 = 객체
      fullName : function( ) => {   // 화살표 함수로 변경 
             return `${this.firstName} ${this.lastName}`
}
=> 이름 전체 호출
=> 정의하지 않았다고 나온다
=> this키워드는 함수가 만든 범위를 가리키게 된다 = 윈도우 객체를 가리킨다

 

 


<디폴트 매개변수>
함수를 쓸 때 매개변수를 사용하는것은 선택
= 매개변수가 있으면 그 값을 사용, 매개변수가 없으면 디폴트 매개변수를 받는다

function rollDie(numSides) {
     if (numSides === undefined) { // 매개변수를 정의하지 않음
         numSides = 6        // numSides를 6이라고 해줌
      } 
      return Math.floor(Math.random( ) * numSides) + 1
}  // 주사위를 무작위로 굴린것과 같은 결과가 나온다
   // rollDie() 함수에 rollDie(20)의 값을 넣어도 작동이 잘 된다
=> 옛날 방식, 매개변수가 여러 개 있으면 곤란해진다
function multiply(a, b = 1) {  // a = 디폴트값X, 어떤 값을 넣든지 첫 번째 인수가 된다
     return a * b;                // b = 디폴트값O, b를 없애면 디폴트 값인 1이 나온다
}
multiply(4);  // 4
multiply(4, 5);  // 20

function greet(msg = "Hey there", person) {   // msg 디폴드 값 사용
     console.log(`${msg}, ${person}!`)
}
greet("Hello", "Joaquin")
=> Hello, Joaquin! 출력
greet("Joaquin")
=> Joaquin, undefined! 출력

= 디폴드 값을 사용하는 경우 매개변수의 순서가 중요하다
=> 디폴드 값을 가지는 매개변수는 2번째 이상의 순서에 오는게 좋다

function greet(person, msg = "Hey there") {
     console.log(`${msg}, ${person}!`)
}

 



<SPREAD(전개 구문)>
배열과 같이 반복 가능한 객체를 전개 구문을 사용하여 확장한다
함수로 호출할 경우엔 인수로, 배열 리터럴에서는 요소로 확장할 수 있다
객체 리터럴의 경우 객체 표현식은 키-값 쌍으로 확장할 수 있다
전개 구문의 역할 = 어떤 것을 가져와서 펼치는 역할

Math.max(12,123,41,42,5,1,23,4,52,6,116,321,44,23,31)
=> 321

const nums = [12,123,41,42,5,1,23,4,52,6,116,321,44,23,31]
Math.max(nums)
=> NaN   // 숫자 전체가 있는 배열이 통과되기 때문에 어떻게 출력해야 할지 모름
//이런 경우 전개 사용
//= 점 세개가 필요
//= ...nums
Math.max(...nums)
=> 321
console.log(nums)
=> [12,123,41,42,5,1,23,4,52,6,116,321,44,23,31]
console.log(...nums)
=> 12 123 41 42 5 1 23 4 52 6 116 321 44 23 31 // 숫자 사이에 공백이 생김

const cats = ['Blue', 'Scout', 'Rocket'];
const dogs = ['Rusty', 'Wyatt'];

const allPets = [...cats, ...dogs];
=> ['Blue', 'Scout', 'Rocket', 'Rusty', 'Wyatt']

=> 객체를 복사할 때 전개를 사용해서 펼친다 -> 라이브러리나 React 도구로 작업할 때 유용하다
     = 정보의 소스를 펼쳐서 다른 용도로 만드는 것

 


<나머지 매개변수>
함수를 만들 때 => 인수 객체라는 값이 함수로 전달
인수 객체 = 배열과 비슷해 보임 => 유사 배열 객체라고도 한다
             = 함수로 전달된 인수를 모두 가지고 있다
                하지만 배열 메서드는 사용할 수 없다 = 배열과 비슷하지만 배열이 아니기때문
나머지 연산자 = 점 세 개로 만들고 매개변수 목록에 들어간다
                     남아 있는 인수를 모두 모으고 배열로 나타낸다
                     인수 = 화살표 함수에서 사용할 수 없다 => 나머지 매개변수가 필요한 부분

function sum(...nums) {
     console.log(nums)
} 
// 처음에 호출했던 매개변수를 가질 수 있다는 의미
function raceResults(gold, silver, ...everyoneElse){  // 나머지 참가자
      console.log(`GOLD MEDAL GOES TO: ${gold}`)
      console.log(`SILVER MEDAL GOES TO: ${silver}`)
      console.log(`AND THANKS TO EVERYONE ELSE: ${everyoneElse}`)
}
=> raceResults('Tammy', 'Todd', 'Tina', 'Trevor', 'Travis')
=> GOLD MEDAL GOES TO: Tammy
     SILVER MEDAL GOES TO: Todd
     AND THANKS TO EVERYONE ELSE: Tina, Trevor, Travis  // 나머지

 

 

 

Coding Test Practice
Description
정수 배열 arr와 2개의 구간이 담긴 배열 intervals가 주어집니다. intervals는 항상 [[a1, b1], [a2, b2]]의 꼴로 주어지며 각 구간은 닫힌 구간입니다. 닫힌 구간은 양 끝값과 그 사이의 값을 모두 포함하는 구간을 의미합니다. 이때 배열 arr의 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 return 하는 solution 함수를 완성해 주세요.
function solution(arr, intervals) {
    var answer = [];
    var first = [];
    var second = [];
    first = arr.slice(intervals[0][0],intervals[0][1]+1);
    second = arr.slice(intervals[1][0],intervals[1][1]+1);
    for(var i = 0; i < first.length; i++){
        answer.push(first[i]);
    }
    for(var i = 0; i < second.length; i++){
        answer.push(second[i]);
    }
    return answer;
}

 

 

 

Description
머쓱이네 피자가게는 피자를 여섯 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 매개변수로 주어질 때, n명이 주문한 피자를 남기지 않고 모두 같은 수의 피자 조각을 먹어야 한다면 최소 몇 판을 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.
function solution(n) {
    // 피자 = 6조각
    // 피자판 % 사람 == 0
    for(var pizza = 1; pizza <= n; pizza++){
        if((pizza * 6) % n == 0){
             return pizza;
        }
    }   
}

 

 

 

Description
문자열 binomial이 매개변수로 주어집니다. binomial은 "a op b" 형태의 이항식이고 a와 b는 음이 아닌 정수, op는 '+', '-', '*' 중 하나입니다. 주어진 식을 계산한 정수를 return 하는 solution 함수를 작성해 주세요.
function solution(binomial) {
    var answer = " "
    
    binomial = binomial.split(' ');
    
    var a = Number(binomial[0])
    var b = Number(binomial[2])

    if(binomial[1] == "+"){
        return answer = a + b;
    }
    if(binomial[1] == "-"){
        return answer = a - b;
    }
    if(binomial[1] == "*"){
        return answer = a * b;
    }
}

 

 

 

Description
정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다.
"w" : 수에 1을 더한다.
"s" : 수에 1을 뺀다.
"d" : 수에 10을 더한다.
"a" : 수에 10을 뺀다.
그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다. 주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.
function solution(numLog) {
    var answer = '';
    for(var i = 0; i < numLog.length-1; i++){
        if(numLog[i+1] - numLog[i] == 1){
            answer += "w";
        }
         if(numLog[i+1] - numLog[i] == -1){
            answer += "s";
        }
         if(numLog[i+1] - numLog[i] == 10){
            answer += "d";
        }
         if(numLog[i+1] - numLog[i] == -10){
            answer += "a";
        }
    }
    return answer;
}

 

 

 

Description
1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.
세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.
세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻습니다.
세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다.
세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
function solution(a, b, c) {
    var answer = 0;
    var sum1 = (a + b + c);
    var sum2 = (a*a + b*b + c*c);
    var sum3 = (a*a*a + b*b*b + c*c*c
                
    if(a != b && a != c && b != c){
        return sum1;
    }
    if(a == b && a == c && b == c){
        return sum1 * sum2 * sum3;
    }
     if(a == b || a == c || b == c){
        return sum1 * sum2;
    }
}

 

 

 

 

2023. 10. 05 (목)

관련글 더보기