분류 전체보기 (254)
2022-03-10 17:13:29
반응형

실습 1일차_Injection (Constructor)

의존성 주입의 방법으로는 크게 3가지가 있다.

  • 생성자 주입(Constructor Injection)
  • 필드 주입(Field Injection)
  • 세터 주입(Setter Injection)

Constructor Injection 방식을 권장하는 이유

생성자 주입 방식을 권장하는 이유
- 단일 책임의 원칙
생성자의 인자가 많아지면서 하나의 클래스가 많은 책임을 떠안는다는 걸 알게된다.
그래서 Constructor Injection을 사용해 의존관계, 복잡성을 쉽게 알 수 있다.
 
- 의존성이 숨는다
DI(Dependency Injection) 컨테이너를 사용한다는 것은 클래스가 자신의 의존성만 책임지는게 아니다.
제공된 의존성 또한 책임진다. 그래서 클래스가 어떤 의존성을 책임지지 않을 때, 메소드나 생성자를 통해
커뮤니케이션이 되어야한다. 하지만 Field Injection은 숨은 의존성만 제공해준다.
 
- DI 컨테이너의 결합성과 테스트의 용이성
DI 프레임워크의 핵심은 관리되는 클래스가 DI 컨테이너에 의존성이 없어야한다.
즉, 필요한 의존성을 전달하면 독립적으로 인스턴스화 할 수 있는 단순 POJO여야한다.
DI 컨테이너 없이 유닛테스트에서 인스턴스화 가능하며, 테스트 가능하다.
컨테이너 결합성이 없다면 관리하거나 관리하지 않는 클래스를 사용할 수 있고, 다른 DI 컨테이너로 전환할 수 있다.
 
- Immutability (불변 객체)
생성자 주입 방식에서 필드는 final로 선언할 수 있다.
하지만, 필드 주입 방식에서는 final로 선언할 수 없어 객체가 변경 가능한 상태가 된다.
 
- 순환 의존성
생성자 주입 방식에서 순환 의존성을 가질 경우 BeanCurrentlyCreationExcepiton을 발생시킴으로써 순환 의존성을 알 수 있다.
1번 클래스가 2번 클래스를 참조하는데, 다시 2번 클래스가 1번 클래스를 참조하는 경우 순환 의존성이라고 부른다.

 

 Spring Constructor Injection 1

MainClass.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import com.service.UserService;

public class MainClass {
	public static void main(String[] args) {
		
		// IoC Container
		ApplicationContext ctx = 
				new GenericXmlApplicationContext("classpath:com/config/user.xml");

		UserService service =
				ctx.getBean("service", UserService.class);
		System.out.println(service.getMesg());
	}
}

UserService.java

package com.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

// POJO Class
public class UserService {

	String mesg; // null ==> 외부에서 문자열을 주입
	
	// 생성자 주입
	public UserService(String m) {
		this.mesg = m;
	}
	public String getMesg() {
		return mesg;
	}
}

user.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="service" class="com.service.UserService">
		<constructor-arg name="m" value="helloWorld" />
	</bean>
	<!-- 
		위의 코드는 다음 코드와 동일하다.
		UserService service = new UserService("helloWorld");
	 -->
</beans>

* 출력 화면 

 

 Spring Constructor Injection 2

MainClass.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

import com.service.UserService;

public class MainClass {

	public static void main(String[] args) {
		
		// IoC Container
		ApplicationContext ctx = 
				new GenericXmlApplicationContext("classpath:com/config/user.xml");

		UserService service =
				ctx.getBean("service", UserService.class);
		System.out.println(service);
		
		UserService service2 =
				ctx.getBean("service2", UserService.class);
		System.out.println(service2);
		
		UserService service3 =
				ctx.getBean("service3", UserService.class);
		System.out.println(service3);	
	}
}

UserService.java

package com.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

// POJO Class
public class UserService {
	// 인스턴스
	String mesg; // null ==> 외부에서 문자열을 주입
	int num; 	 // 0 ==> 외부에서 값을 주입
	
	// 생성자 주입
	public UserService(String m) {
		this.mesg = m;
		
	}
	
	public UserService(int n) {
		this.num = n;
	}
	
	// overriding
	public UserService(String m, int n) {
		this.mesg = m;
		this.num = n;
	}
	
	// getter
	public String getMesg() {
		return mesg;
	}
	
	public int getNum() {
		return num;
	}

	// toString
	@Override
	public String toString() {
		return "UserService [mesg=" + mesg + ", num=" + num + "]";
	}	
}

user.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="service" class="com.service.UserService">
		<constructor-arg name="m" value="홍길동"></constructor-arg> 
		<!-- 홍길동이 생성자에 의해서 mesg 변수에 저장이 됨 -->
	</bean>

	<bean id="service2" class="com.service.UserService">
		<constructor-arg name="n" value="20"></constructor-arg>
	</bean>
	
	<bean id="service3" class="com.service.UserService">
		<constructor-arg name="m" value="이순신"></constructor-arg>
		<constructor-arg name="n" value="44"></constructor-arg>
	</bean>

</beans>

* 출력 화면

 

 Spring Constructor Injection 3_Service_dao 추가

MainClass.java

import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import com.service.UserService;

public class MainClass {

	public static void main(String[] args) {

		// IoC Container
		ApplicationContext ctx = 
				new GenericXmlApplicationContext("classpath:com/config/user.xml");
		
		UserService service = ctx.getBean("service", UserService.class);
		List<String> list = service.list();
		System.out.println(list);
	}
}

UserService.java

package com.service;
import java.util.List;
import com.dao.UserDAO;

public class UserService {

	UserDAO dao;
	
	// 생성자 주입
	public UserService(UserDAO dao) {
		this.dao = dao;
	}
	
	public List<String> list(){
		return dao.list();
	}
}

UserDAO.java

package com.dao;
import java.util.Arrays;
import java.util.List;

public class UserDAO {

	// DB 연동 가정
	public List<String> list(){
		List<String> list = Arrays.asList("홍길동", "고길동", "신길동");
		return list;
	}
}

user.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="dao" class="com.dao.UserDAO" />
	<!-- UserDAO dao = new UserDAO(); -->
	<bean id="service" class="com.service.UserService">
		<constructor-arg name="dao" ref="dao" /> <!-- 생성자를 이용하여 주입하면  constructor-arg-->
	</bean>
	<!-- 
		UserService service = new UserService();
	 -->
</beans>

* 출력 화면 :

 

 출처

 

Constructor Injection 방식을 권장하는 이유 : https://n1tjrgns.tistory.com/230

+ 강의 교재

반응형
2022-03-10 15:22:38
반응형

Spring 실습 1일차_Bean Create

 

 Bean Create

Main.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import com.service.UserService;

public class Main {
	public static void main(String[] args) {
		
		// IoC 컨테이너 생성 ==> XXXXApplicationContext	
		ApplicationContext ctx = new GenericXmlApplicationContext("user.xml");
		
		// 생성된 빈 접근
		UserService service = ctx.getBean("service", UserService.class);
		System.out.println(service.getMesg());
	}
}

UserDAO.java

package com.dao;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.service.UserService;

public class UserDAO {
private static final Logger logger = LoggerFactory.getLogger(UserService.class);
	
	public UserDAO() {
		logger.info("UserDAO 생성자");
	}
}

UserService.java

package com.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

// POJO Class
public class UserService {

	private static final Logger logger = LoggerFactory.getLogger(UserService.class);
	
	public UserService() {
		logger.info("UserService 생성자");
	}
	
	// 메서드 추가
	public String getMesg() {
		return "UserService";
	}
}

user.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<!-- bean 등록  (/:empty tag) -->
	<bean id="service" class="com.service.UserService" />
	<bean id="dao" class="com.dao.UserDAO"/>
</beans>

 

* Console 출력값 : 

 

Bean Create_Pakage 추가

MainClass.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {

	public static void main(String[] args) {
		
		// IoC Container
		ApplicationContext ctx = 
				new GenericXmlApplicationContext("com/config/user.xml");
	}
}

UserService.java

package com.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

// POJO Class
public class UserService {

	private static final Logger logger = LoggerFactory.getLogger(UserService.class);
	public UserService() {
		logger.info("UserService 생성자");
	}
	
	// 메서드 추가
	public String getMesg() {
		return "UserService";
	}
}

user.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- bean 등록  (/:empty tag) -->
	<bean id="service2" class="com.service.UserService" />
</beans>

 

 출처

 

 

+ 강의 교재

반응형
2022-03-09 08:01:25
반응형

평균 구하기

 

 문제 설명

 

N개의 마을로 이루어진 나라가 있습니다. 이 나라의 각 마을에는 1부터 N까지의 번호가 각각 하나씩 부여되어 있습니다. 각 마을은 양방향으로 통행할 수 있는 도로로 연결되어 있는데, 서로 다른 마을 간에 이동할 때는 이 도로를 지나야 합니다. 도로를 지날 때 걸리는 시간은 도로별로 다릅니다. 현재 1번 마을에 있는 음식점에서 각 마을로 음식 배달을 하려고 합니다. 각 마을로부터 음식 주문을 받으려고 하는데, N개의 마을 중에서 K 시간 이하로 배달이 가능한 마을에서만 주문을 받으려고 합니다. 다음은 N = 5, K = 3인 경우의 예시입니다.

위 그림에서 1번 마을에 있는 음식점은 [1, 2, 4, 5] 번 마을까지는 3 이하의 시간에 배달할 수 있습니다. 그러나 3번 마을까지는 3시간 이내로 배달할 수 있는 경로가 없으므로 3번 마을에서는 주문을 받지 않습니다. 따라서 1번 마을에 있는 음식점이 배달 주문을 받을 수 있는 마을은 4개가 됩니다.
마을의 개수 N, 각 마을을 연결하는 도로의 정보 road, 음식 배달이 가능한 시간 K가 매개변수로 주어질 때, 음식 주문을 받을 수 있는 마을의 개수를 return 하도록 solution 함수를 완성해주세요.

 

 제한 사항

 

 

  • 마을의 개수 N은 1 이상 50 이하의 자연수입니다.
  • road의 길이(도로 정보의 개수)는 1 이상 2,000 이하입니다.
  • road의 각 원소는 마을을 연결하고 있는 각 도로의 정보를 나타냅니다.
  • road는 길이가 3인 배열이며, 순서대로 (a, b, c)를 나타냅니다.
    • a, b(1 ≤ a, b ≤ N, a != b)는 도로가 연결하는 두 마을의 번호이며, c(1 ≤ c ≤ 10,000, c는 자연수)는 도로를 지나는데 걸리는 시간입니다.
    • 두 마을 a, b를 연결하는 도로는 여러 개가 있을 수 있습니다.
    • 한 도로의 정보가 여러 번 중복해서 주어지지 않습니다.
  • K는 음식 배달이 가능한 시간을 나타내며, 1 이상 500,000 이하입니다.
  • 임의의 두 마을간에 항상 이동 가능한 경로가 존재합니다.
  • 1번 마을에 있는 음식점이 K 이하의 시간에 배달이 가능한 마을의 개수를 return 하면 됩니다.

 

 

 입출력 예

 

N arr K result
5 [[1,2,1], [2,3,3], [5,2,2], [1,4,2], [5,3,1], [5,4,2]] 3 4
6 [[1,2,1], [1,3,2], [2,3,2], [3,4,3], [3,5,2], [3,5,3], [5,6,1]] 4 4

 

입출력 예 설명

입출력 예 #1
문제의 예시와 같습니다.

입출력 예 #2
주어진 마을과 도로의 모양은 아래 그림과 같습니다.


1번 마을에서 배달에 4시간 이하가 걸리는 마을은 [1, 2, 3, 5] 4개이므로 4를 return 합니다.

 

 Python 코드

 

플로이드워셜

def solution(N, road, K):
    INF = 1000000000
    answer = 0
    graph = [[INF] * (N + 1) for _ in range(N + 1)]
 
    for i in range(1, N + 1):
        for j in range(1, N + 1):
            if i == j:
                graph[i][j] = 0
 
    for r in road:
        a, b, c = r[0], r[1], r[2]
        if graph[a][b] > c:
            graph[a][b] = c
            graph[b][a] = c
 
    for i in range(1, N + 1):
        for j in range(1, N + 1):
            for k in range(1, N + 1):
                graph[j][k] = min(graph[j][k], graph[j][i] + graph[i][k])
 
    for j in range(1, N + 1):
        if graph[1][j] <= K:
            answer += 1
 
    return answer

다익스트라 

from queue import PriorityQueue
 
 
def solution(N, road, K):
    INF = 1000000000
    answer = 0
    distance = [INF] * (N + 1)
 
    q = PriorityQueue()
    q.put([1, 0])
    distance[1] = 0
    while not q.empty():
        now, now_cost = q.get()
 
        if now_cost > distance[now]: continue
        for start, dest, cost in road:
            next_cost = now_cost + cost
            if start == now and next_cost < distance[dest]:
                distance[dest] = next_cost
                q.put([dest, next_cost])
            elif dest == now and next_cost < distance[start]:
                distance[start] = next_cost
                q.put([start, next_cost])
 
    for i in range(1, N + 1):
        if distance[i] <= K:
            answer += 1
 
    return answer

* 참고 링크 : https://foameraserblue.tistory.com/86

 

 C++ 코드

 

#include <vector>
#include <queue>
using namespace std;
 
vector<pair<int,int>> V[55];
vector<int> Dist;
 
int Min(int A, int B) { if (A < B) return A; return B; }
 
void Dijkstra(int N)
{
    priority_queue<pair<int, int>> PQ;
    PQ.push(make_pair(0, 1));
    Dist[1] = 0;
 
    while (PQ.empty() == 0)
    {
        int Cost = -PQ.top().first;
        int Cur = PQ.top().second;
        PQ.pop();
 
        for (int i = 0; i < V[Cur].size(); i++)
        {
            int Next = V[Cur][i].first;
            int nCost = V[Cur][i].second;
 
            if (Dist[Next] > Cost + nCost)
            {
                Dist[Next] = Cost + nCost;
                PQ.push(make_pair(-Dist[Next], Next));
            }
        }
    }
}
 
int solution(int N, vector<vector<int> > road, int K)
{
    Dist.resize(N + 1, 2e9);
    for (int i = 0; i < road.size(); i++)
    {
        int N1 = road[i][0];
        int N2 = road[i][1];
        int Dist = road[i][2];
 
        V[N1].push_back(make_pair(N2, Dist));
        V[N2].push_back(make_pair(N1, Dist));
    }
 
    Dijkstra(N);
    int answer = 0;
    for (int i = 1; i <= N; i++)
    {
        if (Dist[i] <= K) answer++;
    }
 
    return answer;
}

* 참고 링크 : https://yabmoons.tistory.com/633

 출처

 

https://programmers.co.kr/learn/courses/30/lessons/12978

반응형
2022-03-08 17:53:32
반응형

Spring Framework 용어 정리

 

 Spring Framework 용어 정리 1 (Version)

 

① Spring Framework Version : 4.3.30 release

② JDK Version : 1.8

③ DB Version : Oracle 11g Express Edition 

④ Servlet / JSP Version : 추후 확인 예정

⑤ Build Tool ( 빌드 툴 )

⑥ logging → logback

⑦ 버전관리 (형상관리) → Git / Github

 

 Spring Framework 용어 정리 2 (POJO & IoC & Bean)

① POJO (Plain Old Java Object)

- 어떠한 것도 implements & extends 하지 않음

- public class classname { } → 독립적 => 재사용 ↑

- Spring 환경에 의존적 X

 

② IoC (Inversion of Control : 제어의 역행)

 

③ Bean → 클래스를 의미

 

 Spring Framework 용어 정리 3 (IoC Container)

 

IoC Container

=> 궁극적인 기능 Bean들의 Life Cycle 관리 

=> IoC 기능을 담당하는 그릇

* IoC 기능 : 외부에서 Bean을 생성하고 필요 시 주입

 

 

 Spring Framework 용어 정리 4 (Spring Framework 개발 방법)

 

① xml 이용 : Bean 등록, 주입, ...

 

② @(어노테이션) + 최소한의 xml 이용

 

③ @(어노테이션) 이용 ( Java Coding Configuration )

* Spring Boot는 @(어노테이션) 기반

 

 Spring Framework 용어 정리 5 (AOP)

 

AOP ( Aspect Oriented Programming )

 

 

 Spring Framework 용어 정리 6 (Spring)

 

Spring → Java 기반

→ View를 생성하는 방법이 다양한 기술을 활용한다.

ex) JSP/Servlet, Velocity, thymeleaf => html(Spring Boot), pdf, excel, ... 

=>  View Resolve Bean 이용

JSP/Servlet 전담 View Resolver

Internal Resource View Resolver

 

 Spring Framework 용어 정리 7 (Spring Framework 실행 순서)

 

@ + 최소한의 xml 이용

① Bean 생성 (Class 생성)

② xml 등록

<bean id="" class="" />

③ IoC Container에게 xml 인식

//XXXXAplicationContext

ApplicationContext ctx = new GenericXmlApplicationContext("classpath:com/config/user.xml");

Bean 얻기

ctx.getBean("id", A.class);

 

 Spring Framework 용어 정리 8 (Bean 간의 사용)

 

 

 출처

 

 

+ 강의 교재

반응형
2022-03-04 14:43:09
반응형

Big Countries

 

 문제 설명

 

Create table If Not Exists World (name varchar(255), continent varchar(255), area int, population int, gdp int)Truncate table Worldinsert into World (name, continent, area, population, gdp) values ('Afghanistan', 'Asia', '652230', '25500100', '20343000000')insert into World (name, continent, area, population, gdp) values ('Albania', 'Europe', '28748', '2831741', '12960000000')insert into World (name, continent, area, population, gdp) values ('Algeria', 'Africa', '2381741', '37100000', '188681000000')insert into World (name, continent, area, population, gdp) values ('Andorra', 'Europe', '468', '78115', '3712000000')insert into World (name, continent, area, population, gdp) values ('Angola', 'Africa', '1246700', '20609294', '100990000000')

 

able: World

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| name        | varchar |
| continent   | varchar |
| area        | int     |
| population  | int     |
| gdp         | int     |
+-------------+---------+
name is the primary key column for this table.
Each row of this table gives information about the name of a country, the continent to which it belongs, its area, the population, and its GDP value.

 

A country is big if:

  • it has an area of at least three million (i.e., 3000000 km2), or
  • it has a population of at least twenty-five million (i.e., 25000000).

Write an SQL query to report the name, population, and area of the big countries.

Return the result table in any order.

The query result format is in the following example.

 

 입출력 예

 

Example 1:

Input: 
World table:
+-------------+-----------+---------+------------+--------------+
| name        | continent | area    | population | gdp          |
+-------------+-----------+---------+------------+--------------+
| Afghanistan | Asia      | 652230  | 25500100   | 20343000000  |
| Albania     | Europe    | 28748   | 2831741    | 12960000000  |
| Algeria     | Africa    | 2381741 | 37100000   | 188681000000 |
| Andorra     | Europe    | 468     | 78115      | 3712000000   |
| Angola      | Africa    | 1246700 | 20609294   | 100990000000 |
+-------------+-----------+---------+------------+--------------+
Output: 
+-------------+------------+---------+
| name        | population | area    |
+-------------+------------+---------+
| Afghanistan | 25500100   | 652230  |
| Algeria     | 37100000   | 2381741 |
+-------------+------------+---------+

 

 Oracle Query

 

select name, population, area 
from world 
where area >= 3000000 or population >= 25000000;

 

 

 출처

 

https://leetcode.com/problems/big-countries/

반응형
2022-03-03 17:45:40
반응형

jQuery 다운로드 & CDN 방식 적용

 

 jQuery 다운로드

 

* jQuery 다운로드 방식

https://jquery.com/download/

 

Download jQuery | jQuery

link Downloading jQuery Compressed and uncompressed copies of jQuery files are available. The uncompressed file is best used during development or debugging; the compressed file saves bandwidth and improves performance in production. You can also download

jquery.com

 

1. jQuery 사이트 접속 → Download → Download the compressed, production jQuery 3.6.0 &

Download the uncompressed, development jQuery 3.6.0 마우스 우클릭하여 다른 이름으로 링크 저장

2. Eclipse에서 생성한 프로젝트 - WebContent - jQuery 작업할 경로에 복사

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="jquery-3.6.0.min.js"></script> <!-- jQuery 다운 받음 -->
<script type="text/javascript">

	// jQuery Code 작업
	console.log($(document));

</script>
</head>
<body>
</body>
</html>

 

 CDN 방식 - Google

https://developers.google.com/speed/libraries#jquery

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js">
</script><!-- CDN 방식 -->
<script type="text/javascript">

	// jQuery Code 작업
	console.log($(document));

</script>
</head>
<body>
</body>
</html>

 

 출처

 

 

+ 강의 교재

반응형
2022-03-01 08:32:31
반응형

연결 - 라이브 vs 추출

 

(1) Tableau public version은 지원 안하며, Tableau Desktop version만 지원

라이브 - 항상 데이터베이스를 향해 직접적으로 쿼리를 날림

추출 - 데이터베이스 현재 상태를 스캔본으로 뜨는 것과 같음

(해당 스캔본을 local pc에 저장하기 때문에 처리 속도 빠름)

 

필터

 

(2) 데이터 원본 필터

 

 

 출처

 

웰컴 투 태블로 월드

https://www.inflearn.com/course/%ED%83%9C%EB%B8%94%EB%A1%9C%EA%B0%95%EC%A2%8C-1

 

 

 

+ 강의 교재

반응형
2022-02-25 17:43:24
반응형

Contains Duplicate 

 

 문제 설명

 

Given an integer array nums, return true if any value appears at least twice in the array, and return false if every element is distinct.

 

 제한 사항

 

 

  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109

 

 

 입출력 예

 

Example 1:

Input: nums = [1,2,3,1]
Output: true

Example 2:

Input: nums = [1,2,3,4]
Output: false

Example 3:

Input: nums = [1,1,1,3,3,4,3,2,4,2]
Output: true

 

 

 Python 코드

 

Python code 

class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        return len(set(nums)) != len(nums)

* 참고 링크 : https://leetcode.com/problems/contains-duplicate/discuss/1159570/Python-99.25-faster

https://leetcode.com/problems/contains-duplicate/discuss/471215/Python-sol-by-native-set-and-length.-run-time-90%2B

 

class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
    	hashset = set()
        
        for n in nums:
        	if n in hashset:
            	    return True
        	hashset.add()
        return False

* 참고 링크 : https://www.youtube.com/watch?v=3OamzN90kPg 

 

 C++ 코드

 

C ++ code

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_map<int,bool> map;
        for(size_t i = 0;i<nums.size();++i)
        {
            if(map[nums[i]]==true)
                return true;
            map[nums[i]]=true;
        }
        return false;
    }
};

* 참고 링크 : https://kkminseok.github.io/posts/leetcode_Contains_Duplicate/

 

 출처

 

https://leetcode.com/problems/contains-duplicate/

반응형
2022-02-25 17:12:29
반응형

평균 구하기

 

 문제 설명

 

자연수 N이 주어진다. N을 이진수로 바꿔서 출력하는 프로그램을 작성하시오.

 

 입력

 

첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 100,000,000,000,000)

 

 출력

 

N을 이진수로 바꿔서 출력한다. 이진수는 0으로 시작하면 안 된다.

 

 Python 코드

 

# 첫째 줄에 자연수 N을 입력하고 정수형으로 변환
N = int(input())

# N을 이진수로 변환하고 앞의 0b를 제외한 값을 저장
N = bin(N)[2:]

# 이진수로 변환한 결과 출력
print(N)

# print(bin(n)[2:])
# print(bin(int(input()))[2:])

* 참고 링크 : https://brightnightsky77.tistory.com/122

def trans(n):
    if (n<1):
        return '0'
    elif (n==1):
        return '1'
    if (n%2==0):
        return trans(int(n/2)) + '0'
    elif (n%2==1):
        return trans(int(n/2)) + '1'

n = int(input())
answer = trans(n)
print(answer)

* 참고 링크 : https://velog.io/@sxxzin/BaekjoonPython%EC%9D%B4%EC%A7%84%EC%88%98-%EB%B3%80%ED%99%98

https://my-coding-notes.tistory.com/137

 C++ 코드

 

#include <iostream>
using namespace std;

int facto(int n) {
	if (n <= 1)
		return 1;
	else
		return n * facto(n - 1);
}

int main() {
	int n;
	cin >> n;
	cout << facto(n) << '\n';
}

* 참고 링크 : https://codesyun.tistory.com/73

 출처

 

https://www.acmicpc.net/problem/10829

반응형
2022-02-25 02:05:00
반응형

팩토리얼

 

 문제 설명

 

0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.

 

 입력

 

첫째 줄에 정수 N(0 ≤ N ≤ 12)이 주어진다.

 

 출력

 

첫째 줄에 N!을 출력한다.

 

 

 Python 코드

 

def factorial(n):
    result = 1
    if n > 0:
        result = n * factorial(n-1)
    return result

n = int(input())
print(factorial(n))

 

* 참고 링크 : https://ooyoung.tistory.com/114

 

 C++ 코드

 

#include <cstdio>

int factorial(int n)
{
    if(n <= 1)
        return 1;
    return n * factorial(n-1);
}

int main() {
    int num;
    scanf("%d",&num);
    printf("%d",factorial(num));
}

* 참고 링크 : https://cryptosalamander.tistory.com/36

 출처

 

https://www.acmicpc.net/problem/10872

반응형
2022-02-24 11:23:40
반응형

Could not publish server configuration for Tomcat v8.5 Server at localhost.

 

Could not publish server configuration for Tomcat v8.5 Server at localhost.

 

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 서버 버전 이름: Apache Tomcat/8.5.75

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: Server 빌드 시각: Jan 17 2022 22:07:47 UTC

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: Server 버전 번호: 8.5.75.0

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 운영체제 이름: Windows 10

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 운영체제 버전: 10.0

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 아키텍처: amd64

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 자바 홈: C:\Program Files\Eclipse Adoptium\jdk-8.0.312.7-hotspot\jre

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: JVM 버전: 1.8.0_312-b07

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: JVM 벤더: Temurin

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: CATALINA_BASE: C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: CATALINA_HOME: C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 명령 행 아규먼트: -Dcatalina.base=C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 명령 행 아규먼트: -Dcatalina.home=C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 명령 행 아규먼트: -Dwtp.deploy=C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 명령 행 아규먼트: -Djava.endorsed.dirs=C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\endorsed

2월 24, 2022 10:22:59 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: 명령 행 아규먼트: -Dfile.encoding=UTF-8

2월 24, 2022 10:22:59 오전 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
정보: APR 버전 [1.7.0]을(를) 사용한, APR 기반 Apache Tomcat Native 라이브러리 [1.2.30]을(를) 로드했습니다.

2월 24, 2022 10:22:59 오전 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
정보: APR 용량정보들: IPv6 [true], sendfile [true], accept filters [false], random [true].

2월 24, 2022 10:22:59 오전 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
정보: APR/OpenSSL 설정: useAprConnector [false], useOpenSSL [true]

2월 24, 2022 10:22:59 오전 org.apache.catalina.core.AprLifecycleListener initializeSSL
정보: OpenSSL이 성공적으로 초기화되었습니다: [OpenSSL 1.1.1k 25 Mar 2021]

2월 24, 2022 10:23:00 오전 org.apache.coyote.AbstractProtocol init
정보: 프로토콜 핸들러 ["http-nio-8090"]을(를) 초기화합니다.

2월 24, 2022 10:23:06 오전 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
정보: Using a shared selector for servlet write/read

2월 24, 2022 10:23:06 오전 org.apache.catalina.startup.Catalina load
정보: Initialization processed in 9790 ms

2월 24, 2022 10:23:07 오전 org.apache.catalina.core.StandardService startInternal
정보: 서비스 [Catalina]을(를) 시작합니다.

2월 24, 2022 10:23:07 오전 org.apache.catalina.core.StandardEngine startInternal
정보: 서버 엔진을 시작합니다: [Apache Tomcat/8.5.75]

2월 24, 2022 10:23:07 오전 org.apache.catalina.startup.HostConfig deployDescriptor
정보: 배치 descriptor [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\conf\Catalina\localhost\ShopMiniMall.xml]을(를) 배치합니다.

2월 24, 2022 10:23:07 오전 org.apache.catalina.startup.HostConfig deployDescriptor
경고: 호스트 appBase 내의 docBase [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step49_ShopMiniMall12_장바구니전체삭제]이(가) 지정되었으나, 이는 무시될 것입니다.

2월 24, 2022 10:23:07 오전 org.apache.catalina.core.ContainerBase addChildInternal

심각: ContainerBase.addChild: start: org.apache.catalina.LifecycleException:
구성요소 [org.apache.catalina.webresources.StandardRoot@4c01392]을(를) 시작하지 못했습니다. at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198) at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4880) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5018) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:727) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:695) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:673) at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1881) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)

Caused by:
java.lang.IllegalArgumentException: 지정된 주요 리소스셋 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\ShopMiniMall]은(는) 유효하지 않습니다. at org.apache.catalina.webresources.StandardRoot.createMainResourceSet(StandardRoot.java:747) at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:705) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ... 13 more

2월 24, 2022 10:23:07 오전 org.apache.catalina.startup.HostConfig deployDescriptor
심각: 배치 descriptor [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\conf\Catalina\localhost\ShopMiniMall.xml]을(를) 배치하는 중 오류 발생

java.lang.IllegalStateException: 자식 컨테이너를 시작하는 중 오류 발생 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:757) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:727) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:695) at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:673) at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1881) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)

Caused by:
org.apache.catalina.LifecycleException: 구성요소 [org.apache.catalina.webresources.StandardRoot@4c01392]을(를) 시작하지 못했습니다. at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198) at org.apache.catalina.core.StandardContext.resourcesStart(StandardContext.java:4880) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5018) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753) ... 9 more

Caused by:
java.lang.IllegalArgumentException: 지정된 주요 리소스셋 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\ShopMiniMall]은(는) 유효하지 않습니다. at org.apache.catalina.webresources.StandardRoot.createMainResourceSet(StandardRoot.java:747) at org.apache.catalina.webresources.StandardRoot.startInternal(StandardRoot.java:705) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ... 13 more

2월 24, 2022 10:23:07 오전 org.apache.catalina.startup.HostConfig deployDescriptor
정보: 배치 descriptor [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\conf\Catalina\localhost\ShopMiniMall.xml]의 배치가 [183] 밀리초 내에 완료되었습니다.

2월 24, 2022 10:23:07 오전 org.apache.catalina.startup.HostConfig deployDescriptor
정보: 배치 descriptor [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\conf\Catalina\localhost\step51_miniproject_homepage.xml]을(를) 배치합니다.

2월 24, 2022 10:23:07 오전 org.apache.catalina.startup.HostConfig deployDescriptor
경고: 호스트 appBase 내의 docBase [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step51_miniproject_homepage]이(가) 지정되었으나, 이는 무시될 것입니다.

2월 24, 2022 10:23:08 오전 org.apache.catalina.startup.HostConfig deployDescriptor
정보: 배치 descriptor [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\conf\Catalina\localhost\step51_miniproject_homepage.xml]의 배치가 [1,591] 밀리초 내에 완료되었습니다.

2월 24, 2022 10:23:08 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\docs]을(를) 배치합니다.

2월 24, 2022 10:23:09 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\docs]에 대한 배치가 [173] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:09 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\examples]을(를) 배치합니다.

2월 24, 2022 10:23:13 오전 org.apache.catalina.core.ApplicationContext log
정보: ContextListener: contextInitialized()

2월 24, 2022 10:23:13 오전 org.apache.catalina.core.ApplicationContext log
정보: SessionListener: contextInitialized()

2월 24, 2022 10:23:13 오전 org.apache.catalina.core.ApplicationContext log
정보: ContextListener: attributeAdded('StockTicker', 'async.Stockticker@1adad3e5')

2월 24, 2022 10:23:13 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\examples]에 대한 배치가 [4,372] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:13 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\host-manager]을(를) 배치합니다.

2월 24, 2022 10:23:13 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\host-manager]에 대한 배치가 [205] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:13 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\playdata\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\manager]을(를) 배치합니다.

2월 24, 2022 10:23:13 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\playdata\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\manager]에 대한 배치가 [244] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:13 오전 org.apache.catalina.startup.HostConfig deployDirectory 정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\ROOT]을(를) 배치합니다.

2월 24, 2022 10:23:14 오전 org.apache.catalina.startup.HostConfig deployDirectory 정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\ROOT]에 대한 배치가 [309] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:14 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step46_web15_board2]을(를) 배치합니다.

2월 24, 2022 10:23:14 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step46_web15_board2]에 대한 배치가 [113] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:14 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step49_miniproject_ShopMiniMall06_로그아웃]을(를) 배치합니다.

2월 24, 2022 10:23:14 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step49_miniproject_ShopMiniMall06_로그아웃]에 대한 배치가 [88] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:14 오전 org.apache.catalina.startup.HostConfig deployDirectory 정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step49_ShopMiniMall12_장바구니전체삭제]을(를) 배치합니다.

2월 24, 2022 10:23:19 오전 org.apache.jasper.servlet.TldScanner scanJars 정보: 적어도 하나의 JAR가 TLD들을 찾기 위해 스캔되었으나 아무 것도 찾지 못했습니다. 스캔했으나 TLD가 없는 JAR들의 전체 목록을 보시려면, 로그 레벨을 디버그 레벨로 설정하십시오. 스캔 과정에서 불필요한 JAR들을 건너뛰면, 시스템 시작 시간과 JSP 컴파일 시간을 단축시킬 수 있습니다.

2월 24, 2022 10:23:19 오전 org.apache.catalina.startup.HostConfig deployDirectory
정보: 웹 애플리케이션 디렉토리 [C:\test\apache-tomcat-8.5.75\apache-tomcat-8.5.75\webapps\step49_ShopMiniMall12_장바구니전체삭제]에 대한 배치가 [4,795] 밀리초에 완료되었습니다.

2월 24, 2022 10:23:19 오전 org.apache.coyote.AbstractProtocol start
정보: 프로토콜 핸들러 ["http-nio-8090"]을(를) 시작합니다.

2월 24, 2022 10:23:19 오전 org.apache.catalina.startup.Catalina start 정보: Server startup in 12433 ms

 

 

 해결방법

 

아직 해결하지 못하고 있다.

 

 

 

 출처

 

 

+ 강의 교재

반응형
2022-02-18 16:18:08
반응형

Hashing

 

 문제 설명

 

APC에 온 것을 환영한다. 만약 여러분이 학교에서 자료구조를 수강했다면 해시 함수에 대해 배웠을 것이다. 해시 함수란 임의의 길이의 입력을 받아서 고정된 길이의 출력을 내보내는 함수로 정의한다. 해시 함수는 무궁무진한 응용 분야를 갖는데, 대표적으로 자료의 저장과 탐색에 쓰인다.

이 문제에서는 여러분이 앞으로 유용하게 쓸 수 있는 해시 함수를 하나 가르쳐주고자 한다. 먼저, 편의상 입력으로 들어오는 문자열에는 영문 소문자(a, b, ..., z)로만 구성되어있다고 가정하자. 영어에는 총 26개의 알파벳이 존재하므로 a에는 1, b에는 2, c에는 3, ..., z에는 26으로 고유한 번호를 부여할 수 있다. 결과적으로 우리는 하나의 문자열을 수열로 변환할 수 있다. 예를 들어서 문자열 "abba"은 수열 1, 2, 2, 1로 나타낼 수 있다.

해시 값을 계산하기 위해서 우리는 문자열 혹은 수열을 하나의 정수로 치환하려고 한다. 간단하게는 수열의 값을 모두 더할 수도 있다. 해시 함수의 정의에서 유한한 범위의 출력을 가져야 한다고 했으니까 적당히 큰 수 M으로 나눠주자. 짜잔! 해시 함수가 완성되었다. 이를 수식으로 표현하면 아래와 같다.

 H=∑i=0l−1aimodM

해시 함수의 입력으로 들어올 수 있는 문자열의 종류는 무한하지만 출력 범위는 정해져있다. 다들 비둘기 집의 원리에 대해서는 한 번쯤 들어봤을 것이다. 그 원리에 의하면 서로 다른 문자열이더라도 동일한 해시 값을 가질 수 있다. 이를 해시 충돌이라고 하는데, 좋은 해시 함수는 최대한 충돌이 적게 일어나야 한다. 위에서 정의한 해시 함수는 알파벳의 순서만 바꿔도 충돌이 일어나기 때문에 나쁜 해시 함수이다. 그러니까 조금 더 개선해보자.

어떻게 하면 순서가 달라졌을때 출력값도 달라지게 할 수 있을까? 머리를 굴리면 수열의 각 항마다 고유한 계수를 부여하면 된다는 아이디어를 생각해볼 수 있다. 가장 대표적인 방법은 항의 번호에 해당하는 만큼 특정한 숫자를 거듭제곱해서 곱해준 다음 더하는 것이 있다. 이를 수식으로 표현하면 아래와 같다.

 H=∑i=0l−1airimodM

보통 r과 M은 서로소인 숫자로 정하는 것이 일반적이다. 우리가 직접 정하라고 하면 힘들테니까 r의 값은 26보다 큰 소수인 31로 하고 M의 값은 1234567891(놀랍게도 소수이다!!)로 하자.

이제 여러분이 할 일은 위 식을 통해 주어진 문자열의 해시 값을 계산하는 것이다. 그리고 이 함수는 간단해 보여도 자주 쓰이니까 기억해뒀다가 잘 써먹도록 하자.

 

 입력

 

첫 줄에는 문자열의 길이 L이 들어온다. 둘째 줄에는 영문 소문자로만 이루어진 문자열이 들어온다.

입력으로 주어지는 문자열은 모두 알파벳 소문자로만 구성되어 있다.

 

 출력

 

문제에서 주어진 해시함수와 입력으로 주어진 문자열을 사용해 계산한 해시 값을 정수로 출력한다.

 

 Python 코드

 

def solution(arr):
    return sum(arr) / len(arr)

 

 

 C++ 코드

 

 

 

 출처

 

 

반응형